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

Why Python works faster when declaring integer variable with int()?

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

所以我尝试了下面的代码,看看"explicitly"声明效果

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) 进行了一些测试,结果非常接近没有类型的 "declaration".

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

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

• 真实:运行 过程从开始到结束实际花费的时间,就好像是人用秒表测量的一样

• 用户:所有CPU在计算过程中累计花费的时间

• sys:所有 CPU 在 system-related 任务(例如内存分配)期间花费的累计时间。

→ 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

发生这种情况是因为 python 缓存并重用了一些不可变的 built-in 对象,即使它们 "stored" 作为不同的变量

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

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

如果您将计时测试放在不同的文件中并 运行 它们分开,或者如果您先 运行 int(1) 测试,您会看到不同的结果。

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

Python 2 当您 运行 range(repeat) 时创建一个包含一百万个整数的显式列表,这很慢。它还为所有这些整数保留内存,因此 range(repeat) 第二次不那么慢。这很可能是时间差异的来源,与调用 int.

无关

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

for i in xrange(repeat):
    do_stuff()