用于在python代码中配置服务器端执行时间的选项

时间:2012-04-07 12:58:38

标签: python http profiling multicore execution

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

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

我的其他选择是什么?

感谢。

1 个答案:

答案 0 :(得分: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非常清楚地告诉我运行的速度有多慢,并且给出了每次通话时间/呼叫次数的良好数据,以及该方法花费的总时间。显然这是微不足道的/玩具代码,但我经常使用cProfile来了解我的代码花费最多的时间,并且我发现它对于非平凡的代码非常有效。我想它可以为您提供所需的数据。