2014-01-26 37 views
0

我正在使用timeit函數在我編寫的兩種方法上運行一些度量標準,並且遇到問題。見簡化的例子如下文件:如何正確導入函數以供timeit使用

fileA.py,這種運行獨立,和我想要測試的功能,foo且timeit:

if (len(sys.argv) < 2): 
    print "Need a command line argument, exiting" 
    sys.exit(1) 

def foo(n): 
    #does some stuff, returns an int 

此功能工作正常的獨立,我可以運行它作爲./fileA.py 5

我有一個類似的文件,fileB.py這是一個不同的foo實現,但是除了foo的內部完全相同。

現在我有一個fileC,在那裏我想雙方的fileA使用timeit和FILEB(略FILEB部分):

for n in range(0,10): 
    setupStr = 'from fileA import foo' 
    setupStr += '; from __main__ import n' 
    mytime = timeit.Timer('foo(n)', setupStr) 
    timeTaken = mytime.timeit(1) 
    print #results, not important 

,我得到的問題,就是當我運行fileC。 py,我得到「需要命令行參數,exitng」並退出。我知道這是來自fileA.py,但爲什麼這部分代碼是在運行呢?我的印象是timeit的工作方式,我只從fileA導入foo。我錯了嗎?如果是這樣,那麼糾正這種情況的最好方法是什麼,以便我可以測試foo(n)方法並使fileA能夠使用所需的命令行參數獨立運行?

+1

您還可以簡化雖然它沒有解決導入問題,但它直接導入模塊,然後使用'functools.partial'創建一個可直接傳遞給'timeit'的可調用對象(而不是一個包含代碼的字符串)。 –

+0

@KarlKnechtel Nifty,我會相當頻繁地使用timeit,我認爲(這是針對數據結構中的一門課程),所以下次我會嘗試一下。 – turbo

回答

2

Python有評估整個fileA模塊來解決from fileA import foo - 這將是完全合法擁有foo是模塊級變量名,而不是一個功能,通過代碼創建了必須進行評估,以得到正確的值。爲了避免這種情況,換行的應該只有運行時fileA被稱爲獨立代碼:

if __name__ == '__main__': 
    if (len(sys.argv) < 2): 
     ... 

見接受的答案對這個問題的更詳細的解釋: What does if __name__ == "__main__": do?

+0

工作完美,謝謝!特別感謝您對詳細解釋的鏈接。 – turbo