如何在python中测量算法的运行时间[重复]

Posted

技术标签:

【中文标题】如何在python中测量算法的运行时间[重复]【英文标题】:how to measure running time of algorithms in python [duplicate] 【发布时间】:2010-04-18 12:01:18 【问题描述】:

可能的重复:Accurate timing of functions in pythonaccurately measure time python function takes

我如何测量和比较我用 python 编写的算法的运行时间。如果可以的话,还请给我一个不错的算法站点/论坛,例如 ***。

【问题讨论】:

类似于***.com/questions/889900/… 这两个线程都是关于计时的任务。它可能需要比为函数计时更复杂的事情。 另外,关于算法的问题(只要它们与编程相关)当然欢迎在 Stack Overflow 上提问。 类似于***.com/questions/7370801/… 【参考方案1】:

对于小型算法,您可以使用模块 timeit 来自 python 文档:

def test():
    "Stupid test function"
    L = []
    for i in range(100):
        L.append(i)

if __name__=='__main__':
    from timeit import Timer
    t = Timer("test()", "from __main__ import test")
    print t.timeit()

不太准确但仍然有效,您可以像这样使用模块时间:

from time import time
t0 = time()
call_mifuntion_vers_1()
t1 = time()
call_mifunction_vers_2()
t2 = time()

print 'function vers1 takes %f' %(t1-t0)
print 'function vers2 takes %f' %(t2-t1)

【讨论】:

+1 用于展示如何在 main 中的函数上运行 timeit。在比较几种不同的做事方法时很有用 虽然链接到你从哪里得到它会更有用... ;-) docs.python.org/2/library/timeit.html#examples【参考方案2】:

timeit 模块对此很有用,它包含在标准 Python 发行版中。

例子:

import timeit
timeit.Timer('for i in xrange(10): oct(i)').timeit()

【讨论】:

【参考方案3】:

我不是 100% 确定“我用 python 编写的算法的运行时间”是什么意思,所以我想我可能会尝试更广泛地了解一些潜在的答案。

算法没有运行时间;实现可以定时,但算法是做某事的抽象方法。优化程序最常见也是最有价值的部分是analyzing the algorithm,通常使用渐近分析和计算big O 在时间、空间、磁盘使用等方面的复杂性。

计算机无法真正为您完成此步骤。这需要进行数学运算以弄清楚某些东西是如何工作的。优化这方面的事情是获得可扩展性能的主要组成部分。

您可以为您的具体实现计时。 在 Python 中执行此操作的最佳方法是使用 timeit。似乎最想使用的方式是制作一个带有封装您要调用的函数的模块,并使用python -m timeit ...从命令行调用它。

在进行微优化时使用 timeit 比较多个 sn-ps,但通常不是您想要比较两种不同算法的正确工具。通常您需要的是渐近分析,但您可能需要更复杂的分析类型。

你必须知道该计时大多数 sn-ps 不值得改进。你需要在它们真正重要的地方进行更改,尤其是当你在做微优化而不是提高渐近复杂度的时候你的算法。

如果您将代码花费 1% 时间的函数的速度提高四倍,这并不是真正的加速。如果您将程序花费 50% 时间的函数的速度提高 20%,那么您将获得真正的收益。

要确定真正的 Python 程序花费的时间,请使用 stdlib profiling utilities。这将告诉您代码在示例程序中花费时间的位置。

【讨论】:

-1 告诉他你不明白他的问题提出了一些深奥的观点,然后继续回答他的问题,你一直都明白。【参考方案4】:

使用装饰器来测量函数的执行时间会很方便。 http://www.zopyx.com/blog/a-python-decorator-for-measuring-the-execution-time-of-methods 有一个例子。

下面我厚颜无耻地粘贴了上述网站的代码,以便示例存在于 SO 中,以防网站从网络上消失。

import time                                                

def timeit(method):

    def timed(*args, **kw):
        ts = time.time()
        result = method(*args, **kw)
        te = time.time()

        print '%r (%r, %r) %2.2f sec' % \
              (method.__name__, args, kw, te-ts)
        return result

    return timed

class Foo(object):

    @timeit
    def foo(self, a=2, b=3):
        time.sleep(0.2)

@timeit
def f1():
    time.sleep(1)
    print 'f1'

@timeit
def f2(a):
    time.sleep(2)
    print 'f2',a

@timeit
def f3(a, *args, **kw):
    time.sleep(0.3)
    print 'f3', args, kw

f1()
f2(42)
f3(42, 43, foo=2)
Foo().foo()

// 约翰

【讨论】:

是否可以将timeit结果传回调用进程;或者调用方法后输出timeit结果? (调用标准输出之前的输出时间让我失望) 这里是更精致的版本:***.com/a/52288622/207661【参考方案5】:

编程语言无关紧要;无论使用哪种语言,测量算法的运行时复杂度都是一样的。 Analysis of Algorithms by Stanford on Google Code University 是一个非常好的资源,可以教自己如何分析算法和代码的运行时复杂性。

如果您只想测量一个函数或一段代码在 Python 中运行所花费的时间,那么您可以使用 timeit 或 time 模块,具体取决于代码需要运行多长时间.

【讨论】:

问题是关于运行时间,而不是实际计算时间。 @SeF,您可能是这样解释的,但问题中并没有明确说明。鉴于它说的是“算法”而不是“实现”,这个答案假设的解释是合理的。 @SeF,除此之外,考虑到歧义,我的回答解决了对问题的两种解释(我的回答还提到了 timeit),并且这个答案早于那些更深入地使用timeit 模块。

以上是关于如何在python中测量算法的运行时间[重复]的主要内容,如果未能解决你的问题,请参考以下文章

测量运行时python中每行花费的时间

根据时钟滴答测量算法运行时间

测量随机算法中的并行加速

如何测量我的算法消耗的功率?

python测量代码运行时间方法

如何在cmd中运行不同的python版本[重复]