2014-01-20 82 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具有*完全相同的测试*,所以这不可能是原因。 –

相关问题