簡體   English   中英

Python timeit的兩個非常不同但非常一致的結果

[英]Two very different but very consistent results from Python timeit

在一個稍微有點人為的實驗中,我想將Python的一些內置函數與numpy的函數進行比較。 當我開始計時時,我發現了一些奇怪的東西。

當我寫下以下內容時:

import timeit
timeit.timeit('import math; math.e**2', number=1000000)

我會以極其統計上顯着的方式在幾乎隨機的交替中得到兩個不同的結果。

這在2秒和0.5秒之間交替。

這讓我很困惑,所以我做了一些實驗來弄清楚發生了什么,我只是更加困惑。 所以我嘗試了以下實驗:

[timeit.timeit('import math; math.e**2', number=1000000) for i in xrange(100)]

這完全導致了0.5的數字。 然后我嘗試使用發電機播種:

test = (timeit.timeit('import math; math.e**2', number=1000000) for i in xrange(100))
[item for item in test]

這導致了一個完整的2.0號碼列表。

根據alecxe的建議,我將時間表改為:

timeit.timeit('math.e**2', 'import math', number=1000000)

類似地在大約0.1到0.4秒之間交替,但當我重新比較生成器和列表推導的實驗時,但這次結果被翻轉。 也就是說,生成器表達式經常出現0.1秒的數字,而列表理解返回0.4秒的完整列表。

直接控制台輸出:

>>> test = (timeit.timeit('math.e**2', 'import math', number=1000000) for i in xrange(100))
>>> test.next()
0.15114784240722656

>>> timeit.timeit('math.e**2', 'import math', number=1000000)
0.44176197052001953
>>> 

編輯:我正在使用運行dwm的Ubuntu 12.04,我在xterm和gnome-terminal中看到了這些結果。 我正在使用python 2.7.3

有誰知道這里發生了什么? 這對我來說似乎很奇怪。

事實證明這里發生了一些事情,雖然這些怪癖中顯然有一些我特定於我的機器,但不過我認為值得張貼它們以防有人對同樣的事情感到困惑。

首先,兩個時間函數之間存在差異:

timeit.timeit('math.e**2', 'import math', number=1000000)

import語句是延遲加載的。 如果您嘗試以下實驗,這一點就很明顯了:

timeit.timeit('1+1', 'import math', number=1000000)

與:

timeit.timeit('1+1', number=1000000)

因此,當它直接在列表推導中運行時,看起來這個import語句正在為每個條目加載。 (確切原因可能與我的配置有關)。

過去,回到最初的問題,看起來3/4的時間實際上花了導入數學,所以我猜測當生成等式時,迭代之間沒有緩存存儲,而有導入緩存在列表理解范圍內(再次,確切原因可能是配置特定的)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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