gpt4 book ai didi

python - Python 在所有系统上的执行时间不一致

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:51 24 4
gpt4 key购买 nike

让我对 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)

基本上,它会生成斐波那契的前 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%!

执行时真的需要那么多不同的时间吗?时间不够准确吗?还有什么我想念的吗?我在生成动画方面工作很多,我需要尽可能一致的时间。

最佳答案

您测量的时间非常短,然后某处发生的一点点事情都会产生很大的影响。

我在我的机器(OS X、Core i7、Python 2.7)上运行了您的测试脚本,并制作了这张结果图:

enter image description here

您可以看到大多数时间的计时结果非常一致,但也存在算法花费更多时间的孤立事件(因为发生了其他事情)。


我对你的计时程序做了微小的调整:

results=t.repeat(10, 1000)

所以,现在我们正在计时 1000 个函数调用的运行。总时间是一样的,自然是(10000次调用):

enter image description here

现在您可以看到性能更加可预测。可能你不稳定的部分时间是由于时间方法,而不是因为执行任何事情的时间真的不同。毫秒级计时在现实世界的操作系统环境中是很困难的。即使当您的计算机“无所事事”时,它仍在切换任务、执行后台作业等。


我明白原来的重点不是计算斐波那契数列。但如果是这样,那么选择正确的工具就会有所不同:

import numpy as np

def fib(count):
x = np.arange(count)
a = (((1 + np.sqrt(5))/2) ** x - ((1 - np.sqrt(5)) / 2) ** x) / np.sqrt(5)
a = a.astype('int')

这给出:

Min 0.120 | Max 0.471 | Max/Min 3.928 | Avg 0.125

十倍的速度提升。


关于这个答案中的图像,它们是用 matplotlib 绘制的。第一个是这样完成的:

import matplotlib.pyplot as plt

# create a figure
fig = plt.figure()
# create axes into the figure
ax = fig.add_subplot(111)
# plot the vector results with dots of size 2 (points) and semi-transparent blue color
ax.plot(results, '.', c=(0, 0, 1, .5), markersize=2)

请参阅matplotlib 的文档。使用 IPythonpylab 是最容易上手的。

关于python - Python 在所有系统上的执行时间不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24762030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com