cProfile はかなり堅実で、date.now() のようなものを使用することで間違いなく改善されたと思います。これは、役に立たないフィボナッチジェネレーターと少し役に立たないフィボナッチジェネレーターを比較するために cProfile が生成するものです。
$ python -m cProfile script.py
4113777 function calls (1371305 primitive calls) in 1.337 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 cProfile.py:5(<module>)
1 0.000 0.000 0.000 0.000 cProfile.py:66(Profile)
1 0.009 0.009 1.337 1.337 script.py:1(<module>)
2692508/30 1.069 0.000 1.268 0.042 script.py:3(fib)
74994/25000 0.058 0.000 0.058 0.000 script.py:9(fibber)
1346269 0.200 0.000 0.200 0.000 {max}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2 0.001 0.000 0.001 0.000 {range}
使用したコードは次のとおりです。
import cProfile
def fib(num):
if num < 3:
return max(num, 1)
return fib(num - 1) + fib(num - 2)
fibdict = {0:1, 1:1, 2:2}
def fibber(num):
if num not in fibdict:
n = fibber(num - 1) + fibber(num - 2)
fibdict[num] = n
return fibdict[num]
a = [fib(i) for i in range(30)]
b = [fibber(i) for i in range(25000)]
cProfile は、fib の実行速度がどの程度遅いかを明確に示しており、呼び出しごとの時間/呼び出し数、およびメソッドで費やされた合計時間に関する優れたデータを提供します。明らかにこれは些細な/おもちゃのコードですが、私は定期的に cProfile を使用して、自分のコードが最も多くの時間を費やしている場所を把握しており、重要なコードには非常に効果的であることがわかりました。必要なデータが得られると思います。