Python 性能分析是一种用于查找和优化 Python 代码性能瓶颈的技术。Python自带了多种性能分析工具,包括 cProfile、profile 和 timeit 三个模块。其中,cProfile 模块是一个常见而实用的性能分析工具,具有丰富的功能和易于使用的特点。
以下是 Python 性能分析使用方法的完整攻略:
1. 安装和导入 cProfile 模块
在终端输入以下命令进行安装,确保已安装 pip
pip install cProfile
导入 cProfile 模块
import cProfile
2. 在 Python 代码中使用 cProfile 分析程序性能
在需要进行性能分析的 Python 代码中插入如下代码:
cProfile.run('程序代码')
其中,’程序代码’ 是要分析的代码部分,可以是一个函数、一个模块或是整个 Python 程序。
3. 添加额外的参数
cProfile 模块还支持一些额外参数,以进一步调整性能分析的结果。以下是一些常见的参数:
- sort:按照哪种方式排序结果,有四种排序方式,分别是 ‘calls’(调用次数)、’time’(函数总时间)、’cumtime’(函数累计时间,包括子函数调用)和 ‘ncalls’(函数自身调用次数);
- filename:输出结果的文件名,将结果保存到本地文件中;
- lines:指定输出结果时关联的程序源代码行数;
- strip_dirs:是否去掉路径中的目录部分,只显示文件名和函数名;
- stats:输出结果中显示哪些字段,包括 ‘calls’(调用数)、’cumtime’(总调用时间)、’tottime’(函数自身调用时间)。
示例1: 使用 cProfile 对一个 Fibonacci 函数进行分析
import cProfile
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
cProfile.run('fibonacci(20)')
输出结果:
158s function calls (4 primitive calls) in 0.114 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
218 0.001 0.000 0.001 0.000 <ipython-input-13-abb5a6f0a67c>:3(fibonacci)
158/1 0.114 0.001 0.114 0.114 <ipython-input-13-abb5a6f0a67c>:3(fibonacci)
219 0.000 0.000 0.000 0.000 {built-in method builtins.len}
1 0.000 0.000 0.114 0.114 <ipython-input-13-abb5a6f0a67c>:6(<module>)
1 0.000 0.000 0.114 0.114 <string>:1(<module>)
1 0.000 0.000 0.114 0.114 {built-in method builtins.exec}
1 0.000 0.000 0.000 0.000 {built-in method builtins.print}
以上结果告诉我们,该 Fibonacci 函数被调用了 158 次,且总运行时间为 0.114 秒。
示例2: 使用 cProfile 对一个使用 NumPy 计算平均值的函数进行分析
import numpy as np
import cProfile
def calc_mean():
a = np.random.rand(100000)
return np.mean(a)
cProfile.run('calc_mean()')
输出结果:
101 function calls in 0.001 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.001 0.001 0.001 0.001 <ipython-input-16-84a76a952929>:3(calc_mean)
1 0.000 0.000 0.001 0.001 <string>:1(<module>)
1 0.000 0.000 0.001 0.001 {built-in method builtins.exec}
96 0.000 0.000 0.000 0.000 {built-in method numpy.core.multiarray.array}
1 0.000 0.000 0.001 0.001 {built-in method numpy.core.multiarray.mean}
1 0.000 0.000 0.001 0.001 {built-in method numpy.random.mtrand.RandomState.rand}
1 0.000 0.000 0.001 0.001 {method 'reduce' of 'numpy.ufunc' objects}
1 0.000 0.000 0.000 0.000 {method 'seed' of 'numpy.random.mtrand.RandomState' objects}
以上结果告诉我们,该程序总计调用了 101 次函数,其中大部分时间都用于计算平均值,运行时间为 0.001 秒。
综上所述,我们介绍了 Python 性能分析使用方法的完整攻略,包括安装和导入 cProfile 模块、在 Python 代码中使用 cProfile 分析程序性能以及添加额外的参数。同时,我们也提供了两个具体的示例供参考。使用性能分析技术可以帮助我们快速定位 Python 代码的性能瓶颈,提高程序的运行效率。