关于子功能的部分问题称为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}