【问题标题】:Count number of times my code has been called?计算我的代码被调用的次数?
【发布时间】:2017-10-09 17:23:21
【问题描述】:

我试图弄清楚如何编写我的主程序被调用的次数。

我想计算我的程序被调用了多少次,我们将程序称为“测试”。在程序中可以调用不同的子函数。因此我也希望能够计算它们,我们称它们为“program-1,Program-2 ...等”

我还希望能够查看程序已停止多少次,例如用户需要按下终止开关多少次。

有谁可能知道如何做到这一点?

【问题讨论】:

  • 签出cProfile
  • 你可以在某个地方保存一个日志文件,其中只有一个数字,每次程序启动时都会增加一个数字

标签: python python-3.x count


【解决方案1】:

您可以使用在函数调用或停止时递增的变量。

【讨论】:

  • 如果我们谈论的是被调用和停止的主程序,这将无济于事
【解决方案2】:

关于子功能的部分问题称为profiling

考虑以下示例,它以非常低效的方式计算某些众所周知的函数。

import cProfile

def fibonacci(n):
        if n > 1:
                return fibonacci(n-1) + fibonacci(n-2)
        else:
                return 1

cProfile.run('print("10th Fibonacci number is {}".format(fibonacci(10)))')

如果你运行这个程序,你会收到以下输出:

10th Fibonacci number is 89
         180 function calls (4 primitive calls) in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
    177/1    0.000    0.000    0.000    0.000 fibonacci.py:3(fibonacci)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.000    0.000 {method 'format' of 'str' objects}

输出中有趣的部分是 fibonacci 函数被调用了 177 次来计算第 10 个斐波那契数。

为了完整起见,这里是一个更有效的实现

import cProfile

def internal_fibonacci(n,data):
        if n < 2:
                return 1
        elif data[n]>0:
                return data[n]
        else:
                m = internal_fibonacci(n-1,data) + internal_fibonacci(n-2,data)
                data[n] = m
                return m

def fibonacci(n):
        if n > 2:
                values = [0]*(n+1)
                return internal_fibonacci(n,values)
        else:
                return 1


cProfile.run('print("10th Fibonacci number is {}".format(fibonacci(10)))')

只需要 19 个函数调用

10th Fibonacci number is 89
         23 function calls (5 primitive calls) in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 fibonacci1.py:13(fibonacci)
     19/1    0.000    0.000    0.000    0.000 fibonacci1.py:3(internal_fibonacci)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.000    0.000 {method 'format' of 'str' objects}

【讨论】:

  • 我认为这不能完全回答这个问题。它没有告诉你到目前为止整个程序已经启动了多少次。
猜你喜欢
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 2019-04-28
  • 2021-01-09
  • 1970-01-01
  • 2021-06-10
  • 2021-04-15
  • 1970-01-01
相关资源
最近更新 更多