使用int()声明整数变量时为什么Python工作得更快?

时间:2018-03-21 23:27:28

标签: python performance typing dynamic-typing

在编写仅使用整数运算的算法时,我注意到Python没有利用它。

所以我尝试了以下代码来查看“明确”声明效果

import time

repeat = 1000000

start = time.time()
x = 0
for i in range(repeat):
    x += 1
no_type_time = time.time() - start

start = time.time()
y = int(0)
for i in range(repeat):
    y += 1
int_time = time.time() - start

print('{} - No type'.format(no_type_time))
print('{} - Int'.format(int_time))

代码输出如下:

0.0692429542542 - No type
0.0545210838318 - Int

我认为它与Python是一种动态类型语言有关。但是当我试图找出变量的类型时,使用type(x)和type(y)都输出int。这很奇怪,因为我还使用x = float(0)运行了一些测试,结果非常接近没有类型“声明”的那个。

我想知道它为什么会发生,如果可能的话,可以从Python文档中获得一些解释它的参考。

3 个答案:

答案 0 :(得分:6)

根据str.format输出中的浮点数的精确度(12位有效数字),我们可以看到您可能在Python 2上。

当您运行range(repeat)时,Python 2会创建一个包含一百万个整数的明确列表。它还为所有这些整数保留了内存,因此range(repeat)第二次减慢速度。这很可能是时间差异的来源,与调用int没有任何关系。

在Python 2上,使用xrange代替range几乎总是更好。 xrange按需生成整数,避免内存成本和预先生成整个列表的分配时间:

for i in xrange(repeat):
    do_stuff()

答案 1 :(得分:1)

我无法在linux上重现。 标记:

•real:从开始到结束运行过程所花费的实际时间,好像是由带有秒表的人测量的

•user:计算期间所有CPU花费的累计时间

•sys:所有CPU在系统相关任务(如内存分配)期间所累积的累计时间。

→ time python type.py

real    0m0.219s
user    0m0.000s
sys     0m0.000s

→ time python without_type.py

real    0m0.133s
user    0m0.000s
sys     0m0.000s

答案 2 :(得分:-1)

这是因为python缓存并重用一些不可变的内置对象,即使它们被“存储”为不同的变量

>>> a = 1
>>> id(a)
56188528L
>>> b = int(1)
>>> id(b)
56188528L

Python不必为第二个变量分配任何内存或实例化新对象。它只是重用已经创建的不可变整数对象。

如果您已将时间测试放在不同的文件中并单独运行,或者如果您先运行int(1)测试,那么您会看到不同的结果。