鱼C论坛

 找回密码
 立即注册
查看: 2666|回复: 2

[技术交流] Python 小技巧 044:性能分析(一) —— cProfile

[复制链接]
发表于 2020-1-1 13:37:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2020-1-1 15:21 编辑

Python 性能分析器 —— cProfile


Python 自带的标准模块之一 cProfile 可以帮助我们分析代码的性能。

用法

cProfile.run() 可以运行指定的代码并打印代码性能的分析结果。

例如这一段代码:

  1. import cProfile       # 导入模块
  2. from math import sqrt


  3. def f1():
  4.     s = 0
  5.     for i in range(1000):
  6.         s += i
  7.     return s


  8. def f2():
  9.     list1 = []
  10.     for i in range(1000):
  11.         list1.append(sqrt(i))
  12.     return max(list1), min(list1), len(list1)


  13. def main():
  14.     for i in range(100):
  15.         f1()
  16.         f2()


  17. cProfile.run('''main()''')    # 执行 main() 并打印分析结果
复制代码


执行结果(cProfile 的分析结果):

1.png

  1.          200504 function calls in 0.052 seconds

  2.    Ordered by: standard name

  3.    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
  4.         1    0.000    0.000    0.052    0.052 <string>:1(<module>)
  5.       100    0.024    0.000    0.046    0.000 demo.py:13(f2)
  6.         1    0.001    0.001    0.052    0.052 demo.py:20(main)
  7.       100    0.005    0.000    0.005    0.000 demo.py:6(f1)
  8.         1    0.000    0.000    0.052    0.052 {built-in method builtins.exec}
  9.       100    0.000    0.000    0.000    0.000 {built-in method builtins.len}
  10.       100    0.001    0.000    0.001    0.000 {built-in method builtins.max}
  11.       100    0.001    0.000    0.001    0.000 {built-in method builtins.min}
  12.    100000    0.012    0.000    0.012    0.000 {built-in method math.sqrt}
  13.    100000    0.008    0.000    0.008    0.000 {method 'append' of 'list' objects}
  14.         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

语法格式:

  1. 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 文件内容如下:

  1. # -*- coding: utf-8 -*-

  2. from math import sqrt

  3. list1 = []
  4. for i in range(10000):
  5.     list1.append(sqrt(i))
复制代码


命令行执行:

1.png

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-1 16:40:05 From FishC Mobile | 显示全部楼层
沙发!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-12 18:22:43 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-26 09:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表