如何在python中查找代码的统计信息和执行时间

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中找到代码的统计信息呢?

最后我的意图是以下几点

  • 如何在python中查找代码的统计信息
  • 如何在python中查找整个代码的执行时间
  • 代码的统计实际上意味着什么?
  • 编辑代码:

    例如,我在文件test.py中有上述代码

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

    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}

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

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


    似乎您要问的是如何为Timeit模块提供编程接口。这里有记录。您将需要一个样本集来计算统计数据,例如最小值、最大值、平均值等,这意味着通过timeit模块中包含的timeit类的repeat方法运行calculate多次。

    例如:

    1
    2
    timer = timeit.Timer(calculation)
    results = timer.timeit(10000)


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

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

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