数值数据的Numpy数组显然效果很好,但是将它们用于非数值数据会更慢吗?
例如,假设我有一些嵌套的文本数据列表:
mammals = ['dog', 'cat', 'rat']
birds = ['stork', 'robin', 'penguin']
animals1 = [mammals, birds]
当访问和操作这些数据时,这个嵌套列表的列表会比numpy数组等效更快吗?
import numpy as np
animals2 = np.array(animals1)
由于numpy数组被实现为“strided”数组,其中每个元素具有固定长度,如果转换为numpy数组,具有一些长字符串的“稀疏”字符串列表将耗尽不成比例的内存量。但速度呢?
答案 0 :(得分:3)
正如@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进行其他操作来弄清楚它是如何执行的。源文件指向具有.pyd
函数的_vec_string
(dll类型)文件。
显然,上面两个鳕鱼片段之间存在差异,执行numpy.char.upper()
操作的numpy比执行.upper()
字符串方法所花费的时间长100多倍。
timeit
非常简单,可用于此类代码的小片段。