【问题标题】:numpy vs list for non-numerical datanumpy vs list 用于非数字数据
【发布时间】:2014-01-06 02:20:11
【问题描述】:

数值数据的 Numpy 数组显然工作得很好,但将它们用于非数值数据会慢吗?

例如,假设我有一些嵌套的文本数据列表:

mammals = ['dog', 'cat', 'rat']
birds = ['stork', 'robin', 'penguin']

animals1 = [mammals, birds]

当访问和操作这些数据时,这个嵌套列表列表会比等效的 numpy 数组更快吗?

import numpy as np
animals2 = np.array(animals1)

由于 numpy 数组是作为“跨步”数组实现的,其中每个元素都有固定的长度,如果转换为 numpy 数组,带有几个长字符串的“稀疏”字符串列表将占用不成比例的内存量。但是速度呢?

【问题讨论】:

  • 您可以随时使用timeit 包来对这类事情进行基准测试。
  • numpy 的主要优势在于数值计算的性能。您不太可能看到其他数据类型的显着优势,并且在某些情况下性能可能会差很多。

标签: python arrays numpy


【解决方案1】:

正如@JoshAdel 所指出的,您应该熟悉timeit module。我相信你在问这个比较:

>>> import timeit
>>> timeit.timeit('[[x.upper() for x in y] * 10000 for y in animals1]', setup="mammals = ['dog', 'cat', 'rat']\nbirds = ['stork', 'robin', 'penguin']\nanimals1 = [mammals, birds]", number=10000)
1.7549941045438686
>>> timeit.timeit("numpy.char.upper(animals2)", setup="import numpy\nmammals = ['dog', 'cat', 'rat']\nbirds = ['stork', 'robin', 'penguin']\nanimals1 = [mammals, birds] * 10000\nanimals2=numpy.array(animals1)", number=10000)
221.09816223832195

我根据您的评论更新了测试。这个问题很好,但您可能只需要尝试使用 numpy.char 进行一些其他操作来了解它的执行方式。源文件指向带有_vec_string 函数的.pyd(dll 类型)文件。

显然,上面这两个 cod 的 sn-ps 之间存在差异,numpy 执行 numpy.char.upper() 操作所花费的时间比 python 执行 .upper() 字符串方法所花费的时间要长 100 倍。

timeit 对于像这样的小型 sn-ps 代码非常简单。

【讨论】:

  • 如果你使用的是 IPython,你可以使用%timeit%%timeit 魔法,特别方便。
  • 也许不仅仅是为它们的创建计时,我想知道在animals2 上是否有比amimals1 上更快的操作。 char.upper(animals2)[[x.upper() for x in y] for y in animals1] 简单,但速度不快。如果列表/数组更大,它会改变吗?
猜你喜欢
  • 2019-02-01
  • 2020-12-16
  • 2014-07-12
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多