How to find the statistics and execution times of the code in python
我正在研究python,遇到了一些查找统计信息和代码执行时间的概念。
假设我有以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 | from time import gmtime, strftime import timeit def calculation(): a = 2 b = 3 res = a + b return res if 'name' == 'main' : exec_time = timeit.timeit(calculation) print exec_time |
结果:
1 | 0.2561519145965576 |
所以从上面的代码中,我可以找到代码的执行时间,但是如何在Python中找到代码的统计信息呢?
最后我的意图是以下几点
编辑代码:
例如,我在文件
现在我用下面的命令运行了上面的文件
1 | python -m cProfile test.py |
结果:
1 2 3 4 5 6 7 8 9 10 | sh-4.2$ python -m cProfile test.py 4 function calls in 0.001 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.001 0.001 0.001 0.001 test.py:1(<module>) 1 0.000 0.000 0.000 0.000 timeit.py:105(Timer) 1 0.001 0.001 0.001 0.001 timeit.py:53(<module>) 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} |
因此,当我运行上述代码时,我需要这样的功能,我试图在
至少我想找出文件运行时函数
似乎您要问的是如何为Timeit模块提供编程接口。这里有记录。您将需要一个样本集来计算统计数据,例如最小值、最大值、平均值等,这意味着通过timeit模块中包含的timeit类的repeat方法运行calculate多次。
例如:
1 2 | timer = timeit.Timer(calculation) results = timer.timeit(10000) |
我认为您是在询问如何在代码内使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import cProfile, pstats, functools class profile: def __init__(self, filename=None): """ If defined, output is written to *filename*, otherwise it is processed using *pstats* and printed to STDOUT. """ self._filename = filename self._prof = cProfile.Profile() def __enter__(self): self._prof.enable() def __exit__(self, exc_type, exc_value, traceback): self._prof.disable() if self._filename is not None: self._prof.dump_stats(self._filename) else: stats = pstats.Stats(self._prof) self.print_stats(stats) def print_stats(self, stats): """ This method processes the stats and prints them. """ stats.strip_dirs().sort_stats('cumulative').print_stats(20) def __call__(self, func): self._func = func @functools.wraps(func) def wrapper(*args, **kwargs): with self: return func(*args, **kwargs) return wrapper |
所以用法是:
1 2 3 4 5 6 7 8 | @profile() def calculation(): a = 2 b = 3 res = a + b return res calculation() |
或
1 2 | with profile('output_file.pstat'): calculation() |
您可以根据需要更改