4

我正在研究 python 并遇到了一些查找代码的统计信息和执行时间的概念

假设我有以下代码

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

结果:

0.2561519145965576

所以从上面的代码中我可以找到代码的执行时间,但是如何在 python 中找到代码的统计信息呢?

最后我的意图是以下几点

  1. 如何在python中找到代码的统计信息
  2. 如何在python中找到整个代码的执行时间
  3. 代码统计实际上是什么意思?

编辑代码:

例如我在文件中有上面的代码test.py

现在我用下面的命令运行了上面的文件

python -m cProfile test.py

结果 :

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}

因此,当我运行上述代码时,我需要这样的东西,我正在尝试在文件中编写打印统计信息的功能,而不是使用终端test.py命令运行文件。python -m cProfile test.py

至少我想calculation()在文件运行时找到函数的统计信息和执行时间,因为实际上函数计算具有执行某些操作的大功能。

4

2 回答 2

2

看来您要问的是如何使用 timeit 模块的编程接口。这是记录在这里。您将需要一个样本集来计算统计信息,例如最小值、最大值、平均值等,这意味着通过 timeit 模块中包含的 Timeit 类的重复方法运行多次计算。

例如:

timer = timeit.Timer(calculation)
results = timer.timeit(10000)
于 2012-11-14T08:30:56.630 回答
0

我想你是在问如何cProfile在代码中使用。事实证明这很容易。 cProfile.Profile有两个未记录的方法,enabledisable,可用于启动和停止分析器。这意味着您可以轻松创建上下文管理器或装饰器。以下配方在一个对象中实现了这两个,并包括一种使用pstat模块处理和打印输出的方法。

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

所以用法是:

@profile()
def calculation():
    a = 2
    b = 3
    res = a + b
    return  res

calculation()

或者

with profile('output_file.pstat'):
    calculation()

您可以根据需要进行更改print_stats以显示所需的输出。

于 2012-11-14T09:42:11.373 回答