| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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))
 
  复制代码 
 
命令行执行: 
 
 
 |   
 
 
 
 |