Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python2.7比3.2快?_Python_Python 2.7_Python 3.x - Fatal编程技术网

为什么Python2.7比3.2快?

为什么Python2.7比3.2快?,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我编写了以下程序作为ProjectEulerProblem 12的解决方案,但在Python2.7中需要6.62秒,在Python3.2中需要10.21秒。当然应该是相反的 import time def mainrun(): start = time.time() divnum = 0 i = 0 trinum = 0 while divnum < 501: i += 1 trinum += i d

我编写了以下程序作为ProjectEulerProblem 12的解决方案,但在Python2.7中需要6.62秒,在Python3.2中需要10.21秒。当然应该是相反的

import time

def mainrun():
    start = time.time()
    divnum = 0
    i = 0
    trinum = 0
    while divnum < 501:
        i += 1
        trinum += i
        divnum = 0
        #2nd arg outside - no diff to speed 
        for j in range(1, int(trinum**.5)+1):
            if trinum % j == 0:
                divnum += 1
                if trinum / j != j:
                    divnum += 1
    print(trinum, '\nDivisors:', divnum)
    print('Solved in', round((time.time()-start),2), 'seconds.')

mainrun()
导入时间
def mainlun():
开始=时间。时间()
divnum=0
i=0
三合一=0
当divnum<501时:
i+=1
三合一+=i
divnum=0
#第二个参数外部-无速度差异
对于范围(1,int(trinum**.5)+1)内的j:
如果trinum%j==0:
divnum+=1
如果trinum/j!=j:
divnum+=1
打印(trinum,“\nVisors:”,divnum)
打印('在',四舍五入((time.time()-start),2),'秒')
mainrun()

有人知道为什么Python的更高版本会更慢吗?

Python3 int类型以前是Python2 long类型。多头比整数慢。Python是为简单而不是速度而优化的。

除了更精确的计时之外,Martijn Pieters认为,一个原因可能是不起眼的
/
,在不同的Python版本之间:

Python 2.7:

>>> 5/2
2
>>> from __future__ import division
>>> 5/2
2.5
Python 3.0:

>>> 5/2
2.5
>>> 5//2
2

使用Python 2案例的
from\uuuu future\uuuuu
语句重新尝试计时。

使用
timeit
比较代码片段,以最小化其他操作系统事件(例如磁盘I/O刷新)的影响还有垃圾收集。你为什么要和Python 3.2比较,而不是最新版本?计时是一致的,我在Chromebook上,所以没有硬盘。@b约恩比较2.7和3.4,我分别得到3.25s和6.4s。使用整数除法没有明显的差别。我用
timeit.repeat
,计算了以下相对时间:
{'2.7.6':1.00,'3.2.3':1.47,'3.3.5':1.54,'3.4.0':1.70}
@thebjorn@JanneKarila,指向它(在过渡段中)表示Python 3剩下的唯一问题是长表示中的尾部
L
。也就是说,在Python 2.7中,int/long分割是固定的(与3,IIUC中的方式相同)。@Bjorn我试图指出“本质上,long重命名为int。也就是说,只有一个内置的整数类型,名为int;但其行为与旧的long类型基本相同。”Python 2.7仍然有两个整数类型,并在必要时将
int
自动升级为
long
。说3.0推广的最终结果是Python3.0比Python2.5运行Pythone基准大约慢10%。最可能的最大原因是去除了小整数的特殊外壳。还有改进的余地,但3.0发布后就会出现+1:我修改了2.x测试的函数,使用了
long
整数常量(例如
501
->
501L
),运行时间延长了1.84倍。在编写Python时,您应该始终记住:“没有人期望西班牙宗教法庭!”散列'if'子句(使用only/)结果是相同的计时,所以它必须是其他的。整数平方根包含在范围内,因为+1。整数因子在平方根上方“镜像”,因此使用“if”子句,但该条件可防止整数平方根被重复计数。以前有一个Euler问题使用了这些想法。我也倾向于认为,@Daniel的答案可能更好地解释了这种差异。(不过我还没有做任何测试。)