[英]Issues with using timeit in ipython
我正在快速嘗試在ipython, m1()
和m2()
中計算2個函數,使用2個不同的實現執行相同的任務。
In [23]: %timeit for x in range(100): m1(a)
10000 loops, best of 3: 57.6 us per loop
In [24]: %timeit for x in range(100): m2(a)
10000 loops, best of 3: 108 us per loop
結果:第一次實施快了近2倍。 到現在為止還挺好。
出於好奇,我改變了上面的for
循環的范圍,現在我不知道輸出的意義。
In [25]: %timeit for x in range(1): m2(a)
1000000 loops, best of 3: 1.29 us per loop
In [26]: %timeit for x in range(10): m2(a)
100000 loops, best of 3: 10.8 us per loop
In [27]: %timeit for x in range(1000): m2(a)
1000 loops, best of 3: 1.06 ms per loop
for循環到底在做什么? 為什么循環次數的值會隨着增加范圍值而減小?
PS:我用這個作為參考。 另外,如果標題沒有完全傳達我的問題,請將標題編輯為更好的標題。
timeit
正在計算整個塊的執行時間。
所以你看到的是:
m2(a)
1次需要1.29 us
m2(a)
10次需要10.8 us
m2(a)
1000次需要1.06 ms
這是有道理的,因為1.06ms = 1060 us
,大約是基線的1000倍(而10.8 us是基線的大約10倍)
至於循環次數,timeit旨在在合理的時間內運行:
$ python -mtimeit -h
...
If -n is not given, a suitable number of loops is calculated by trying
successive powers of 10 until the total time is at least 0.2 seconds.
所以我終於明白了發生了什么,感謝@Nirk的回答。
In [26]: %timeit for x in range(100): m2(a)
10000 loops, best of 3: 108 us per loop
這里,
%timeit
=> ipython魔術召喚
for x in range(100): m2(a)
=>正在執行的語句。 根據范圍值,每次運行的執行時間增加/減少
10000 loops
=>基於最小0.2
s總時間的timeit模塊約束,timeit將隱含運行的最小循環次數
best of 3: 108 us per loop
=>按時間運行的最佳3循環所花費的平均時間。
假設每次運行的時間與最佳運行時間的平均值相同,則每次運行的時間= 108 us
需要的最小循環= 10^x
,其中x是滿足1.08 * (10^-4) * (10^x) > 2 * (10^-1)
最小正整數
即, (10^x) > 1.85 * (10^3)
=> x = 4
的最小x
因此,所需的最小循環= 10 ^ x = 10000 loops
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.