Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在所有系统上的执行时间不一致_Python_Performance - Fatal编程技术网

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

Python在所有系统上的执行时间不一致,python,performance,Python,Performance,一些让我对python着迷的东西。。。我以前以为是的,但我错了。我可以使用相同的代码并多次运行它,它的执行时间相差悬殊。以以下测试代码为例: 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 i

一些让我对python着迷的东西。。。我以前以为是的,但我错了。我可以使用相同的代码并多次运行它,它的执行时间相差悬殊。以以下测试代码为例:

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)
因此,Linux是最快的,但也有最多的变化。很多。但它们都有一个相当大的变化:Mac只有200%,但Windows为290%,linux为810%


执行的时间真的有那么长吗?它不够精确吗?我还缺什么吗?我在制作动画方面做了很多工作,我需要尽可能一致的时间。

你测量的时间非常短,然后哪怕是某个地方发生的一点点事情都会产生很大的影响

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

您可以看到,大多数情况下,计时结果都非常一致,但也有一些单独的算法事件需要花费更多的时间(因为还有其他事情发生)


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

results=t.repeat(10, 1000)
所以,现在我们正在计时1000个函数调用的运行。总时间是相同的,当然(10000次呼叫):

现在您可以看到,性能更加可预测。这可能是你不稳定的时间安排的一部分是由于时间安排方法,而不是由于执行任何事情的时间不同。毫秒级计时在现实操作系统环境中很困难。即使你的电脑“什么都不做”,它仍然在切换任务,做后台工作,等等


我知道最初的目的不是计算斐波那契数。但如果是这样,那么选择正确的工具就会有所不同:

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
的文档。通过使用
IPython
pylab
我做了一个类似于@drV的图(给他投票,他是第一个!)-区别在于我对结果进行了排序,这样你就可以看到趋势线。这意味着,即使最大值很高,平均值也很低,因此在最后会有一些异常值

我使用pylab只是在底部添加了以下内容:

from pylab import *
results.sort()
plot(range(len(results)),results)
show()

根据计时器和您的实现,测量的时间可能会受到系统上运行的其他进程的影响。这对于挂钟计时器来说尤其如此。请参阅。。。这就是我所想的(实际执行时间是相当恒定的),但是测量的时间在变化的程度上是相当一致的。你将时间乘以1000。为此,请重复代码,使一个测试运行接近1秒。@Adam Haile-可能想检查一下:@AdamHaile:Python可能会很慢,也可能不会很慢,这实际上取决于您的代码和库。如果你在计算东西,使用NumPy可能会有很大的不同。Python本身不适合数字重载。另一方面,Python非常擅长处理复杂的数据结构(dict、set、list)。。。你是怎么做到的?所以,嗯。。。也许我是对的,我习惯于时间的一致性的原因是我在一个Raspberry Pi上运行,没有UI,几乎没有运行任何服务。我的python获得了90%以上的CPU…足够公平了。。。我觉得情况就是这样,一次只跑一次并不是最好的方式。我遇到的问题是,我试图为动画生成帧,并提供一致的帧速率。因此,单帧步长中的任何变化都可能使其抖动。唯一的解决办法似乎是将帧时间限制为大于最大生成时间的时间。“它很平滑,但速度较慢。”亚当海尔:如果你观察长距离跑步的百分比变化,它是很小的。很容易获得一位数的毫秒延迟,但十毫秒延迟已经是一个很长的延迟了。所以,说到底,你不会因为你的动画而陷入麻烦。但是,如果你能事先计算一下你的动画,你可能会考虑有几个帧的缓冲区。当动画代码运行时,为每帧计算的开始和结束计时实际的挂钟时间戳。然后,您将看到是否存在与操作系统相关的额外延迟。
timeit.Timer
还接受一个“number”参数,以快速计算X次迭代的单次运行时间
timed\u execution=timeit.Timer(“fib(1250)”,setup=“from\uu main\uuuuu import fib”,number=1000)
A definite+1用于显示分布的良好方式!(使用pylab import*接口的
时,可能需要a-.01)
from pylab import *
results.sort()
plot(range(len(results)),results)
show()