【发布时间】:2014-07-15 15:20:36
【问题描述】:
让我对 python 发疯的东西……我以前以为是just Windows,但我错了。我可以拥有完全相同的代码并多次运行它,但它的执行时间却大相径庭。以如下测试代码为例:
import math
def fib(count):
x = 0
while x < count:
a = int(((((1 + math.sqrt(5)) / 2) ** x) - (((1 - math.sqrt(5)) / 2) ** (x))) / math.sqrt(5))
x+=1
if __name__ == '__main__':
import timeit
t = timeit.Timer("fib(1250)", setup="from __main__ import fib",)
#print t.timeit(10)
count = 10000
results = t.repeat(count, 1)
min = 0xFFFF
max = 0
sum = 0
for i in results:
i = i*1000.0
if i < min: min = i
if i > max: max = i
sum+=i
print "Min {:.3f} | Max {:.3f} | Max/Min {:.3f} | Avg {:.3f}".format(min, max, max/min, sum/count)
基本上,它会生成 fibonacii 的前 1250 个元素 10,000 次,并使用 timeit 来获取每次运行所需的时间。然后我合并这些时间并找到最小值、最大值、平均值以及最小值和最大值之间的方差(如果你愿意的话,可以是散布)。
结果如下:
Windows: Min 3.071 | Max 8.903 | Max/Min 2.899 | Avg 3.228
Mac OS: Min 1.531 | Max 3.167 | Max/Min 2.068 | Avg 1.621
Ubuntu: Min 1.242 | Max 10.090 | Max/Min 8.123 | Avg 1.349
因此,Linux 是最快的,但也有最大的差异。很多。但是它们都可以有相当大的波动:Mac 只有 200%,但 Windows 为 290%,Linux 为 810%!
实际上执行所需的时间有很大不同吗?是timeit不够准确吗?还有什么我想念的吗?我在生成动画方面做了很多工作,我需要尽可能一致的时间。
【问题讨论】:
-
根据计时器和您的实现,测量的时间可能会受到系统上运行的其他进程的影响。对于挂钟计时器尤其如此。
-
看...这就是我的想法(实际执行时间是相当恒定的),但测量的时间在它们的变化量上是相当一致的。
-
您将时间乘以 1000。而是通过重复代码来执行此操作,以使一个测试运行接近 1 秒。
-
@Adam Haile - 可能想看看这个:stackoverflow.com/questions/15176619/…
-
@AdamHaile:Python 可能会也可能不会很慢,这实际上取决于您的代码和库。如果您正在计算事物,使用 NumPy 可能会产生巨大的影响。 Python 本身不适用于数值繁重的工作。另一方面,Python 非常擅长处理复杂的数据结构(字典、集合、列表)。
标签: python performance