2017-10-09 100 views
0

我想弄清楚如何编写我的主程序被调用了多少次。计算我的代码被调用的次数?

我想统计我的程序被调用了多少次,让我们调用程序“测试”。在程序中可以调用不同的子功能。因此,我希望能够计数这些,我们称之为“程序-1,程序-2 ...等”

另外我想看看有多少次程序已被停止,如何很多时候用户需要推动kill-switch。

任何人谁可能有任何想法如何做到这一点?

+1

退房[CPROFILE](https://docs.python.org/2/library /profile.html) –

+1

你可以在某个地方保留一个日志文件,只要你的程序每次启动都会增加一个数字 – Sunreef

回答

0

您可以使用一个变量,该函数在函数调用或停止时将递增。

+0

如果我们正在讨论被调用和停止的主程序,这将无济于事 – Sunreef

0

有关子功能的问题部分称为分析

考虑下面的例子,计算效率非常低的某些知名函数

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 Fibonacci数。

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

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} 
+1

我不认为这完全回答了 题。它并没有告诉你整个程序已经发布了多少次。 – Sunreef