如何在python中测量算法的运行时间

时间:2010-04-18 12:01:19

标签: python algorithm

  

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

我如何测量和比较我在python中编写的算法的运行时间。如果可以的话,还可以指向一个很好的算法站点/论坛,如stackoverflow。

5 个答案:

答案 0 :(得分:24)

模块timeit对此非常有用,并且包含在标准Python发行版中。

示例:

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

答案 1 :(得分:23)

对于小算法,您可以使用模块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)

答案 2 :(得分:21)

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

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

    计算机无法真正为您执行此步骤。这需要进行数学计算以确定某些方法的工作原理。优化这方面的事情是实现可扩展性能的主要组成部分。

  • 您可以计算具体实施时间。在Python中执行此操作的最佳方法是使用timeit。最想要使用的方法是创建一个带有函数的模块,该函数封装了您要调用的内容,并使用python -m timeit ...从命令行调用它。

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

  • 您必须知道时间大多数代码段都不值得改进。当你进行微优化并且没有提高算法的渐近复杂度时,你需要在它们实际计数的地方进行更改,尤其是

    如果你的代码花费1%的时间花费的功能的四倍,那不是真正的加速。如果你的程序在50%的时间内花费了20%的速度增加,你就会获得真正的收益。

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

答案 3 :(得分:13)

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

下面我已经无耻地粘贴了上面提到的网站上的代码,以便在网站上删除该网站的示例存在。

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()

//约翰

答案 4 :(得分:0)

编程语言并不重要;无论语言如何,测量算法的运行时复杂度都以相同的方式工作。 Analysis of Algorithms Stanford Google Code University timeit是教你自己如何分析算法和代码的运行时复杂性的非常好的资源。

如果您只想测量函数或代码段在Python中运行所用的时间,那么您可以使用time或{{3}}模块,具体取决于代码需要运行。