2014-01-06 79 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