在编写仅使用整数运算的算法时,我注意到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文档中获得一些解释它的参考。
答案 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)
测试,那么您会看到不同的结果。