在编写仅使用整数算法的算法时,我注意到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)
测试,您将看到不同的结果。