1 方法一:使用 time 函数

1
2
3
4
5
6
7
8
import time

start = time.clock()

#待统计程序段

dur = (time.clock() - start)
print("Time used:", dur)

2 方法二:

在 Jupyter 的 cell 开始处加关键字 time,统计代码段运行时间

1
%%time

注意:使用该方法可能影响 debug 信息输出,debug 时请注意关闭

3 方法三:

在程序行前加关键字 time,统计代码行运行时间

1
%time 程序行

4 方法四:

使用 cProfile 模块生成脚本执行的统计信息文件(运行时间,调用次数),使用 pstats 格式化统计信息,并根据需要做排序分析处理

4.1.1 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cProfile
import pstats
import re

def a():
re.compile("foo|bar")

def b():
for i in range(50000):
a()

cProfile.run('b()', '/tmp/count.out')
p = pstats.Stats("/tmp/count.out")
# 按照运行时间和函数名进行排序, 显示前5个
p.strip_dirs().sort_stats("cumulative", "name").print_stats(5)
# 根据调用次数排序,显示前5个
p.sort_stats('calls').print_stats(5)

输出:

Pasted image 20211222160055.png

显示关键字

ncalls:调用次数

tottime:花费的总时间(不包括调用子函数的时间)

percall:tottime 除以 ncalls 的商

cumtime:函数及其所有子函数累积时间

percall:是 cumtime 除以 ncalls 的商

filename:lineno(function):函数名和位置

排序参数

有效字符串参数 有效枚举参数 含义
calls SortKey.CALLS 调用次数
'cumulative' SortKey.CUMULATIVE 累积时间
'cumtime'N/A 累积时间
'file'N/A 文件名
'filename'SortKey.FILENAME 文件名
'module' N/A 文件名
'ncalls' N/A 调用次数
'pcalls' SortKey.PCALLS 原始调用计数
'line'SortKey.LINE 行号
'name' SortKey.NAME 函数名称
'nfl' SortKey.NFL 名称/文件/行
'stdname' SortKey.STDNAME 标准名称
'time' SortKey.TIME 内部时间
'tottime' N/A 内部时间

5 注意

  • 函数时间统计是包含的关系

6 参考

Python: cProfile 使用

性能剖析与优化

Python分析器