2016-08-24 91 views
0

解釋timeit命令例如我有一個列表:如何解釋在Python

L=[-13, -24, -21, -3, -23, -15, -14, -27, -13, -12] 
  1. 如果類型在%timeit -n 10 myList = [item for item in L if item < 15] 輸出爲10 loops, best of 3: 1.25 µs per loop

  2. 如果I型myGen = (item for item in L if item < 15) 輸出1000000 loops, best of 3: 561 ns per loop

我不明白在情況2中,爲什麼發電機需要1000000個迴路而不是10個迴路? 「3的最好」是什麼意思?那麼我怎樣才能計算出每個總共花費的秒數,例如情況1的10 * 1.25 = 12.5 us?

+0

「最好的3」來自重複次數:-r N,--repeat = N「重複計時器的次數(默認值3)」 – doctorlove

回答

4

在第二個示例中,您沒有在%timeit中包含-n參數,因此ipython根據試運行需要多長時間來改變重複次數;被測試代碼的速度越快,爲了獲得更準確的每次迭代時間值,進行的迭代越多。此外,測試運行多次以儘量減少外部因素(例如,當您的操作系統恰好安排了磁盤緩衝區刷新並且其他一切都變得稍慢)。這是'3最好的'進來的地方;測試連續運行3次,並挑選最佳時機。

%timeit magic command documentation,其中包括這些選項和它們的默認行爲:

-n<N>:在一個循環中執行給定的語句<N>倍。如果沒有給出這個值,則選擇一個擬合值。

-r<R>:重複循環迭代<R>次並取得最佳結果。默認值:3

你的第一個例子確實使用-n 10所以有人只運行10次。

由於創建與發電機表達發生器目的是近乎即時,IPython中可以更頻繁地執行循環方式不是執行列表解析(其具有執行for環路和產生一個列表對象與所有的結果那裏然後)。請記住,生成器表達式不會執行任何任何的工作,直到您開始迭代。

如果您想比較生成器表達式與列表理解產生相同結果需要多長時間,則必須實際進行迭代。你可以通過表達一個list()調用實際產生一個列表太:

%timeit -n 10 myGen = (item for item in L if item < 15); list(myGen) 

這會慢作爲發電機具有比列表理解多一點的開銷:

In [1]: L=[-13, -24, -21, -3, -23, -15, -14, -27, -13, -12] 

In [2]: %timeit -n 10 myList = [item for item in L if item < 15] 
10 loops, best of 3: 1.29 µs per loop 

In [3]: %timeit -n 10 myGen = (item for item in L if item < 15); list(myGen) 
10 loops, best of 3: 1.72 µs per loop 

注意你重新創建發電機每個測試迭代,因爲發電機可以產生他們的輸出一次。