通常我使用shell命令。time
...。我的目的是测试数据是小的、中的、大的还是非常大的集合,需要多少时间和内存使用。
Linux或python有什么工具可以这样做吗?
发布于 2018-03-16 09:15:43
def test():
"""Stupid test function"""
lst = []
for i in range(100):
lst.append(i)
if __name__ == '__main__':
import timeit
print(timeit.timeit("test()", setup="from __main__ import test"))
本质上,您可以将python代码作为字符串参数传递给它,它将在指定的时间内运行并打印执行时间。文档中的重要部分:
timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000)
创建一个Timer
实例,设置代码和定时器函数并运行其timeit
方法数执行死刑。
...而且:
Timer.timeit(number=1000000)
时间数执行主要声明。它只执行一次Setup语句,然后返回执行主语句所需的时间,多次执行,以秒为单位作为浮点数计算。参数是循环的次数,默认为一百万次。将主语句、安装语句和要使用的计时器函数传递给构造函数。注默认情况下,timeit
暂时关闭garbage collection
在时间安排上。这种方法的优点是它使独立的时间更具有可比性。这个缺点是GC可能是被测量函数的性能的一个重要组成部分。如果是,则可以将gc重新启用为设置绳子。例如:timeit.Timer('for i in xrange(10): oct(i)', 'gc.enable()').timeit()
剖析会给你一个多关于发生了什么的更详细的想法。下面是“即时例子”官方文件:
import cProfile
import re
cProfile.run('re.compile("foo|bar")')
这会给你:
197 function calls (192 primitive calls) in 0.002 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.001 0.001 <string>:1(<module>)
1 0.000 0.000 0.001 0.001 re.py:212(compile)
1 0.000 0.000 0.001 0.001 re.py:268(_compile)
1 0.000 0.000 0.000 0.000 sre_compile.py:172(_compile_charset)
1 0.000 0.000 0.000 0.000 sre_compile.py:201(_optimize_charset)
4 0.000 0.000 0.000 0.000 sre_compile.py:25(_identityfunction)
3/1 0.000 0.000 0.000 0.000 sre_compile.py:33(_compile)
这两个模块都应该让您了解在哪里查找瓶颈。
这个模块使用Graphviz创建调用图,如下所示:
你可以很容易地看到哪条路在颜色上消耗的时间最多。您可以使用pycallGraphAPI创建它们,也可以使用打包的脚本:
pycallgraph graphviz -- ./mypythonscript.py
不过,开销相当大。因此,对于已经长期运行的进程,创建图形可能需要一些时间。
发布于 2018-03-16 10:06:58
我用一个简单的装饰器来计时
def st_time(func):
"""
st decorator to calculate the total time of a func
"""
def st_func(*args, **keyArgs):
t1 = time.time()
r = func(*args, **keyArgs)
t2 = time.time()
print "Function=%s, Time=%s" % (func.__name__, t2 - t1)
return r
return st_func
https://stackoverflow.com/questions/-100003626
复制相似问题