2014-01-19 60 views
8

我想測試2個相同列表之間的處理時間,特別是對於普通列表和numpy列表。我的代碼是python中的timeit模塊無法識別numpy模塊

import timeit 
import numpy as np 

t = timeit.Timer("range(1000)") 
print t.timeit() 

u = timeit.Timer("np.arange(1000)") 
print u.timeit() 

計算t是好的,但對於u NameError:全局名稱「NP」沒有定義列。

我應該如何編碼以獲得處理時間?

回答

10

timeit.Timer類可以以兩種不同的方式使用。

它可以將源代碼編譯爲執行 - 在這種情況下,代碼在只運行setup代碼的全新環境中執行,也可以採用可調用代碼,在這種情況下可調用代碼是隻是調用(在你當前的環境中,就像任何其他可調用的)。

所以,你有兩個選擇:

u = timeit.Timer("np.arange(1000)", setup='import numpy as np') 

......或者......

u = timeit.Timer(lambda: np.arange(1000)) 

在第一種情況下,你碰巧的事實已經做了import numpy as np是無關緊要的;它對np.arange(1000)編譯和執行的環境沒有影響(因此您必須將它包含在setup=...位中)。

在第二種情況下,你已經完成了一個import numpy as np明顯事實是相關的,它會影響你的代碼,包括lambda: np.arange(1000),被評估的環境。

2

使用setup參數:

u = timeit.Timer("np.arange(1000)", setup='import numpy as np') 
+0

感謝您的代碼。現在我知道時間了,你知道爲什麼時間在正常列表中(10.4s),比陣列(1.9s)長得多嗎? – user3211991

+0

@ user3211991範圍(1000)在內存中創建列表,嘗試用xrange(1000)替換範圍(1000),http://stackoverflow.com/questions/94935/what-is-the-difference-between-range-and -xrange – ndpu

+0

另請參閱http://stackoverflow.com/questions/10698858/built-in-range-or-numpy-arange-which-is-more-efficient有關範圍和np.arange之間效率的更多詳細信息 – Ffisegydd

2

使用進口圖書館與timeit您在使用setup關鍵字參數(docs)將其導入:

import timeit 

# Doesn't require setup kwarg as range doesn't need to be imported. 
t = timeit.Timer("range(1000)") 
print t.timeit() 

# Requires the import of numpy (as np) through the setup kwarg. 
u = timeit.Timer("np.arange(1000)", setup = 'import numpy as np') 
print(u.timeit()) 

setup關鍵字參數允許你設置您的代碼,例如通過使用from __main__ import func從代碼中導入外部庫或導入函數。

+2

不,您不必使用'setup'關鍵字參數導入它們。如果你傳遞了一個callable而不是代碼來編譯,那麼這個callable已經在你的正常環境中編譯過了(包括任何'import'語句)並且運行得很好。 – abarnert