对于这段代码,为什么Python3.1比2.6慢?

对于这段代码,为什么Python3.1比2.6慢?,python,performance,python-3.x,Python,Performance,Python 3.x,考虑以下代码(从,随着测试数量的增加): 但是,在使用Python 3.1的同一台机器上(Python 3.1.2(r312:79147,2010年4月15日,15:35:48)[GCC 4.4.3]在linux2上),时间是: Norm 28.4206559658 Alt 26.8007400036 有人知道为什么这段代码在Python3.1上运行速度慢了三倍吗?在Python2和Python3中,/操作符执行整数除法(或底除法),而在Python2中,/操作符在给定整数操作数的情况下执行底

考虑以下代码(从,随着测试数量的增加):

但是,在使用Python 3.1的同一台机器上(
Python 3.1.2(r312:79147,2010年4月15日,15:35:48)[GCC 4.4.3]在linux2上),时间是:

Norm 28.4206559658
Alt 26.8007400036

有人知道为什么这段代码在Python3.1上运行速度慢了三倍吗?

在Python2和Python3中,
/
操作符执行整数除法(或底除法),而在Python2中,
/
操作符在给定整数操作数的情况下执行底除法,在给定任何操作数的情况下,在Python3中执行真除法


尝试将
/
操作符替换为
/
操作符。

我的时间从2.5、2.6、2.7和3.1(Windows XP SP2)开始稳步减少。。。使用“/”版本。使用//,3.1倍比2.X倍小得多,例如“正常”从6.35(py2.7)下降到3.62(py3.1)

请注意,在2.x中,有int(机器字,32或64位)和long(可变长度)。在3.x中,long被重命名为int,int也消失了。我的猜测是,从long转换为float可能会导致使用/的额外时间


在任何情况下,更好的“Alt”版本都应该从以下代码开始:

high = 1
highpown = 1
while highpown < x:
    high <<= 1
    highpown <<= n
high=1
高功率=1
当高功率高无需复制:在我的机器上,python3.1比2.6快30%左右。谢谢。你在运行什么操作系统?我在Ubuntu 10.04 64位.32位版本上获得了上述时间system@Paul贝克:我的数字与你在Mac OS X 64位上的数字几乎相同(但使用的是Python 3.1.1 32位而不是3.1.2)。@Paul:这些代码不一样,你忘记了来自未来导入部分的
,没有一个,结果是不同的。虽然我不完全确定这是这个问题的原因,但我怀疑可能是。谢谢。我将
low=high/2
替换为
low=high//2
low=10**(len(str(x))/n)
替换为
low=10**(len(str(x))//n)
。这使得来自未来进口部门的2.6性能与2.6的常规性能保持一致。不幸的是,3.1的性能没有改变——仍然比2.6慢3倍。当然,问题是python3中的“整数”是python2的旧“长”。操作员在这里无关紧要:)“将以此代码开始
”。然后是
low=high//2
?@Paul Baker:当然<代码>低=高/2
是两个函数中的一个错误。+1。我强烈怀疑是
int
long
方面的不同。请注意,在32位机器上,测试的值不适合int,因此您将在Python 2.x和3.x中使用long进行计算。但是在64位机器上,在2.x中使用
int
算法,在3.x中使用任意精度算法。
Norm 28.4206559658
Alt 26.8007400036
high = 1
highpown = 1
while highpown < x:
    high <<= 1
    highpown <<= n