1

我有一个用 Python 编写的 HTTP 服务器,它接受一个大的二进制文件(>50MB)并在文件上执行一些与文件相关的计算(解密、解压缩......)。我想对执行这些操作所需的时间有一个很好的估计。我的 python 服务器在 Ubuntu 11.10 上的多 CPU 和多核服务器上运行。

目前我只是在做一个时间差异 (date.now()以获得各种操作的执行时间。我知道有几个 Python 模块提供分析功能。但是,我的理解是它们仅限于小代码片段。

我还有什么其他选择?

谢谢。

4

1 回答 1

0

我会说 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 来了解我的代码在哪里花费的时间最多,并且我发现它对于非琐碎代码非常有效。我想它会给你你需要的数据。

于 2012-04-07T13:20:53.637 回答