cProfile是从Python 2.5版本开始引入的C语言扩展模块。该模块可用来对代码进行确定性性能分析(deterministic profiling)。确定性性能分析意味着对时长的测量是精确的,没有采用抽样的方式。与此形成对照的是统计性能分析(statistical profiling),其特点是利用随机抽样来估算测量结果。我们将用cProfile分析一个小的NumPy程序,其功能是对一个由随机数构成的数组进行转置。
具体步骤
和之前的攻略一样,我们需要一段待分析的代码。
- 编写待分析的代码。
编写transpose
函数。该函数创建一个由随机数构成的数组并对其进行转置。
def transpose(n):
random_values = numpy.random.random((n, n))
return random_values.T
- 运行分析器。
运行分析器时,需要把待分析的函数作为输入参数。
cProfile.run('transpose(%d)' %(int(sys.argv[1])))
本攻略的完整代码如下。
import numpy
import cProfile
import sys
def transpose(n):
random_values = numpy.random.random((n, n))
return random_values.T
cProfile.run('transpose(%d)' %(int(sys.argv[1])))
对于一个1000×1000的数组,我们得到如下输出结果。
4 function calls in 0.029 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.001 0.001 0.029 0.029 <string>:1(<module>)
1 0.000 0.000 0.028 0.028 cprofile_transpose.py:5(transpose)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.028 0.028 0.028 0.028 {method 'random_sample' of 'mtrand.RandomState' objects}
输出结果中的各个列和用IPython进行性能分析中使用p
选项后的输出相同。