|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zltzlt 于 2020-1-1 15:21 编辑
Python 性能分析器 —— cProfile
Python 自带的标准模块之一 cProfile 可以帮助我们分析代码的性能。
用法
cProfile.run() 可以运行指定的代码并打印代码性能的分析结果。
例如这一段代码:
- import cProfile # 导入模块
- from math import sqrt
- def f1():
- s = 0
- for i in range(1000):
- s += i
- return s
- def f2():
- list1 = []
- for i in range(1000):
- list1.append(sqrt(i))
- return max(list1), min(list1), len(list1)
- def main():
- for i in range(100):
- f1()
- f2()
- cProfile.run('''main()''') # 执行 main() 并打印分析结果
复制代码
执行结果(cProfile 的分析结果):
- 200504 function calls in 0.052 seconds
- Ordered by: standard name
- ncalls tottime percall cumtime percall filename:lineno(function)
- 1 0.000 0.000 0.052 0.052 <string>:1(<module>)
- 100 0.024 0.000 0.046 0.000 demo.py:13(f2)
- 1 0.001 0.001 0.052 0.052 demo.py:20(main)
- 100 0.005 0.000 0.005 0.000 demo.py:6(f1)
- 1 0.000 0.000 0.052 0.052 {built-in method builtins.exec}
- 100 0.000 0.000 0.000 0.000 {built-in method builtins.len}
- 100 0.001 0.000 0.001 0.000 {built-in method builtins.max}
- 100 0.001 0.000 0.001 0.000 {built-in method builtins.min}
- 100000 0.012 0.000 0.012 0.000 {built-in method math.sqrt}
- 100000 0.008 0.000 0.008 0.000 {method 'append' of 'list' objects}
- 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
复制代码
其中:
- 200504 function calls in 0.052 seconds 表示监听了 200504 个函数调用,总用时 0.052 秒(即 52 毫秒)。
- ncalls 表示调用函数的次数。
- tottime 表示函数内部消耗的总时间。
- 第一个 percall 表示函数每次调用消耗的平均时长,是 tottime 除以 ncalls 的商。
- cumtime 表示函数及其所有子函数消耗的总时长。
- 第二个 percall 也表示函数每次调用消耗的平均时长,是 cumtime 除以 ncalls 的商。
- filename:lineno(function) 表示被分析函数所在的文件名、行号及函数名。
命令行调用 cProfile
语法格式:
- python -m cProfile [-o output_file] [-s sort_order] (-m module | myscript.py)
复制代码
参数说明:
参数 | 说明 | -o output_file | 可选参数,表示将分析结果写入的文件(不输出)。 | -s sort_order | 可选参数,按照指定的规则对输出排序(仅适用于不指定 -o 参数的情况下)。 | -m module | 表示需要分析哪个模块。 | myscript.py | 必选参数,指定要分析的脚本。 |
使用示例:
demo.py 文件内容如下:
- # -*- coding: utf-8 -*-
- from math import sqrt
- list1 = []
- for i in range(10000):
- list1.append(sqrt(i))
复制代码
命令行执行:
|
|