2013-06-04 68 views
4

來自實例documentation在一個函數中使用timeit模塊與參數

def test(): 
    """Stupid test function""" 
    L = [] 
    for i in range(100): 
     L.append(i) 

if __name__ == '__main__': 
    import timeit 
    print(timeit.timeit("test()", setup="from __main__ import test")) 

但如何調用帶有參數的功能,例如,像這樣的功能:

def test(some_object): 
    """Stupid test function""" 
    L = [] 
    for i in range(100): 
     L.append(some_object) 
+0

同樣的方法? 'print(timeit.timeit(「test(5)」,setup =「from __main__ import test」))'。如果你想使用一個參數,它是你在timeit代碼之外定義的一個對象,你必須像其他任何東西一樣導入它。 timeit字符串只是普通的Python代碼,一切正常。 – BrenBarn

回答

6

錯了,如果我你的問題是對的,你只是在尋找?

anobj = 42 # where it can be whatever object 
def test(foo): 
    pass # do something with foo 

if __name__ == '__main__': 
    import timeit 
    print(timeit.timeit("test(anobj)", setup="from __main__ import test, anobj")) 
+1

(我喜歡它,當問題的答案是:-p) – zmo

0

你想使用:

def main(): 
    import timeit 
    print(timeit.timeit("test(some_object)")) # don't need to use the 'setup' 

def test(my_object): 
    lst = [] 
    for i in range(100): 
     lst.append(my_object) 

if __name__ == '__main__': 
    main() 
2

這裏有一個解決方案,在這個確切的情況工作對我來說,只要你的論點是不是巨大的矩陣或類似的東西。


假設我想測試一個函數foo(a,b,c)和我已經在我的主函數中初始化的值。我可以撥打電話到以下不改變我的代碼,

timeit.Timer('foo({},{},{})'.format(a,b,c), "from __main__ import foo") 

如果你的參數都是字符串,則必須重新引進引號將值:

timeit.Timer('foo("{}","{}","{}")'.format(a,b,c), "from __main__ import foo") 

是最後一次警告,你必須考慮你的論點將通過str()格式,這可能會導致它們失去各種精度和完整性。如果你使用這種方法,請檢查你的輸入!

相關問題