我有一个用 Python 编写的 HTTP 服务器,它接受一个大的二进制文件(>50MB)并在文件上执行一些与文件相关的计算(解密、解压缩......)。我想对执行这些操作所需的时间有一个很好的估计。我的 python 服务器在 Ubuntu 11.10 上的多 CPU 和多核服务器上运行。
目前我只是在做一个时间差异 (date.now()
以获得各种操作的执行时间。我知道有几个 Python 模块提供分析功能。但是,我的理解是它们仅限于小代码片段。
我还有什么其他选择?
谢谢。
我会说 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 来了解我的代码在哪里花费的时间最多,并且我发现它对于非琐碎代码非常有效。我想它会给你你需要的数据。