2014-01-06 42 views
2

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

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

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

animals1 = [mammals, birds] 

当访问和操作这个数据是嵌套列表将是比numpy的阵列相当于更快的这个名单?

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

由于numpy的阵列被实现为“跨距”的阵列,其中每个元件具有固定的长度,与一些长串将占用的存储器的量不成比例串的“疏”列表中,如果转换为numpy的阵列。但速度呢?

+2

你总是可以使用'timeit'软件包来测试这种事情。 – JoshAdel

+3

numpy的主要优势来自数值计算的性能。您不太可能看到其他数据类型的显着优势,并且在某些情况下性能可能会更差。 – BrenBarn

回答

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来尝试一些其他的操作来找出它的表现。源文件指向带_vec_string函数的.pyd(dll类型)文件。

很明显,这两个cod代码片段之间有一个区别,numpy比python执行.upper()字符串方法执行numpy.char.upper()操作要长100倍。

timeit对于像这样的小代码片段使用非常简单。

+2

如果你使用IPython,你可以使用'%timeit'或'%% timeit'魔术,这非常方便。 – JoshAdel

+1

也许不止是他们的创作时机,我不知道在'animals2'上是否有更快的操作比'amimals1'上的操作更快。 '动词2'比'[[x.upper()for y]]更简单,但动作不会更快。如果列表/数组大得多,它会改变吗? – hpaulj