如何在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中测量算法的运行时间[重复]的主要内容,如果未能解决你的问题,请参考以下文章