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



在编写仅使用整数算法的算法时,我注意到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 文档中获得一些参考来解释它。

str.format输出中浮点数的精度(12 位有效数字(可以看出您可能使用的是 Python 2。

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

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

for i in xrange(repeat):
    do_stuff()

我无法在 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

发生这种情况是因为python缓存并重用了一些不可变的内置对象,即使它们被"存储"为不同的变量。

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

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

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

最新更新