2014-01-20 79 views
24

試驗一些代碼並做一些微觀基準我剛剛發現在一個包含整數的字符串上使用float函數比在同一個字符串上使用int要快2倍。爲什麼float()比int()更快?

>>> python -m timeit int('1') 
1000000 loops, best of 3: 0.548 usec per loop 

>>> python -m timeit float('1') 
1000000 loops, best of 3: 0.273 usec per loop 

它測試int(float('1'))其運行時間比裸int('1')較短時會變得陌生了。

>>> python -m timeit int(float('1')) 
1000000 loops, best of 3: 0.457 usec per loop 

我測試了Windows 7下運行cPython 2.7.6和Linux Mint 16與cPython 2.7.6的代碼。

我必須補充說只有Python 2受到影響,Python 3顯示了運行時之間較小(不顯着)差異的方式。

我知道我通過這樣的微基準得到的信息很容易被濫用,但我很好奇爲什麼在函數的運行時有這樣的區別。

我試圖找到intfloat的實現,但我無法在源代碼中找到它。

+1

無法複製的區別 '雅各布@ devbox:〜$蟒蛇-m timeit 「INT(」 1 「)」 千萬循環,最好的3:每循環0.104次使用' 'jakob @ devbox:〜$ python -m timeit「float(」1「)」 10000000循環,最好是3:每循環0.106 usec' –

+0

@JakobBowyer:我可以,在Python 2.7中。在Python 3.3中,時間更加接近。 –

+0

@MartijnPieters使用Python 2.7.3的Im,每次顯示int都更快或接近完全相同。 –

回答

11

int有很多的基礎。

*,0 *,0X *,0B *,0°*,它可以很長,需要時間來確定基數和其他東西

如果基本設置,這樣可以節省大量的時間

python -m timeit "int('1',10)"  
1000000 loops, best of 3: 0.252 usec per loop 

python -m timeit "int('1')" 
1000000 loops, best of 3: 0.594 usec per loop 

爲@Martijn皮特斯metions代碼的Object/intobject.c(int_new)Object/floatobject.c(float_new)

+3

但這並不能解釋爲什麼Python 3中的int('1')'和float('1')一樣快。 –

+0

@MartijnPieters是的,這可能是技巧 – michaeltang

+3

基地的確定只是掃描第一個字符;如果它不是*'0',那麼'base'被設置爲10.這幾乎不會使它使用兩倍的時間。 Python 3具有*完全相同的測試*,所以這不可能是原因。 –

相關問題