Python 性能分析

  • Post category:Python

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 代码的性能瓶颈,提高程序的运行效率。