簡體   English   中英

在python中導入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM