[英]Python: is there a way to import a variable using timeit.timeit()?
[英]timeit.timeit variable importing in python
我正在嘗試使用timeit.timeit()
來查找執行特定代碼行所需的時間。 問題是這一行包含變量,我需要以某種方式導入它們,所以我的問題是如何? 為了更清楚,代碼看起來像這樣:
def func():
var1 = 'aaa'
var2 = 'aab'
t1 = timeit.timeit('var1==var2', 'from __main__ import ___', number = 10**4) # here I'm missing what to put after the import
如果我試圖在__main__
中執行此代碼,我將直接使用'from __main__ import var1, var2'
導入變量 此類問題有什么解決方案嗎?
timeit.Timer
接受一個可調用的以及一個字符串來評估
在 2.6 版更改: stmt 和 setup 參數現在也可以采用不帶參數可調用的對象。 這會將對它們的調用嵌入到計時器函數中,然后由 timeit() 執行。 請注意,在這種情況下,由於額外的函數調用,時間開銷會稍大一些。
(另見源代碼,尋找elif hasattr(stmt, '__call__'):
)。
在變量上創建一個閉包並將其傳遞給 timeit:
def func():
var1 = 'aaa'
var2 = 'aab'
t1 = timeit.timeit(lambda: var1 == var2, number = 10**4)
或等效地:
def func():
var1 = 'aaa'
var2 = 'aab'
def closure():
return var1 == var2
t1 = timeit.timeit(closure, number = 10**4)
在pdb
調試器和類方法中,接受的答案對我不起作用。 有效的解決方案是將變量添加到globals()
:
globals()['var1'] = var1
globals()['var2'] = var2
timeit.timeit(lambda: var1 == var2, number = 10**4)
使用lambda
的公認答案解決方案會產生大量開銷。 使用設置字符串與替代方案進行比較:
func1 117.3 ms
func2 39.0 ms
func1 116.8 ms
func2 41.6 ms
func1 117.2 ms
func2 35.8 ms
如果您正在嘗試測量如此快速的代碼片段,或比較多個時間,您最好不要用這樣的函數調用的大開銷及其差異來掩蓋它們的執行時間。
產生上述結果的基准代碼( 在線試用! ):
import timeit
def func1():
s1 = 'aaa'
s2 = 'aab'
return timeit.timeit(lambda: s1 == s2)
def func2():
setup = '''
s1 = 'aaa'
s2 = 'aab'
'''
return timeit.timeit('s1 == s2', setup)
for func in [func1, func2] * 3:
print(func.__name__,
'%5.1f ms' % (func() * 1e3))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.