Python 官方文档:入门教程 => 点击学习
上一篇文章我们介绍了基准测试,通过基准测试可以发现程序变慢了,那么是因为什么原因导致性能变慢的,需要进一步做代码性能分析。python同样提供了性能分析工具。 cProfile cProfile是Python默认的
上一篇文章我们介绍了基准测试,通过基准测试可以发现程序变慢了,那么是因为什么原因导致性能变慢的,需要进一步做代码性能分析。python同样提供了性能分析工具。
cProfile是Python默认的性能分析器,他只测量CPU时间,并不关心内存消耗和其他与内存相关联的信息。
from time import sleep
import random
def random_list(start, end, length):
"""
生成随机列表
:param start: 随机开始数
:param end: 随机结束数
:param length: 列表长度
"""
data_list = []
for i in range(length):
data_list.append(random.randint(start, end))
return data_list
def bubble_sort(arr):
"""
冒泡排序: 对列表进行排序
:param arr 列表
"""
n = len(arr)
sleep(1)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
if __name__ == '__main__':
get_data_list = random_list(1, 99, 10)
import cProfile
cProfile.run('bubble_sort({})'.fORMat(get_data_list))
继续使用上一篇文章中的例子,引用cProfile模块,run()方法参数说明。
run(statement, filename=None, sort=-1)
为了使结果统计出耗时部分,我们加了sleep,结果如下:
❯ python demo.py
6 function calls in 1.004 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 1.004 1.004 <string>:1(<module>)
1 0.000 0.000 1.004 1.004 demo.py:19(bubble_sort)
1 0.000 0.000 1.004 1.004 {built-in method builtins.exec}
1 0.000 0.000 0.000 0.000 {built-in method builtins.len}
1 1.004 1.004 1.004 1.004 {built-in method time.sleep}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
line_profiler 可以提供有关时间是如何在各行之间分配的信息,直白一点就是给出程序每行的耗时,在无法确定哪行语句最浪费时间,这很有用。
line_profiler是一个第三方模块,需要安装。
https://GitHub.com/pyutils/line_profiler
from time import sleep
import random
def random_list(start, end, length):
"""
生成随机列表
:param start: 随机开始数
:param end: 随机结束数
:param length: 列表长度
"""
data_list = []
for i in range(length):
data_list.append(random.randint(start, end))
return data_list
@profile
def bubble_sort(arr):
"""
冒泡排序: 对列表进行排序
:param arr 列表
"""
n = len(arr)
sleep(1)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
if __name__ == '__main__':
get_data_list = random_list(1, 99, 10)
bubble_sort(get_data_list)
给需要监控的函数加上@profile
装饰器。通过kernprof
命令运行文件(安装完line_profiler生成的命令)。
参数说明:
运行结果:
kernprof -l -v demo.py
Wrote profile results to demo.py.lprof
Timer unit: 1e-06 s
Total time: 1.00416 s
File: demo.py
Function: bubble_sort at line 18
Line # Hits Time Per Hit % Time Line Contents
==============================================================
18 @profile
19 def bubble_sort(arr):
20 """
21 冒泡排序: 对列表进行排序
22 :param arr 列表
23 """
24 1 8.0 8.0 0.0 n = len(arr)
25 1 1004030.0 1004030.0 100.0 sleep(1)
26 11 15.0 1.4 0.0 for i in range(n):
27 55 44.0 0.8 0.0 for j in range(0, n - i - 1):
28 45 41.0 0.9 0.0 if arr[j] > arr[j + 1]:
29 20 21.0 1.1 0.0 arr[j], arr[j + 1] = arr[j + 1], arr[j]
30 1 1.0 1.0 0.0 return arr
输出非常直观,分成了6列。
只需查看% Time列,就可清楚地知道时间都花在了什么地方。
性能测试分析站在项目层面是一个很庞大的话题,以前为测试工程师,关注的是性能工具的使用,以及用户维度的性能[1];作为开发工程师,每个功能都是由一个个函数/方法组成,我们去分析每个函数/方法,甚至是每行代码的耗时,才能更好的进行代码层面的性能优化。
以上就是python如何做代码性能分析的详细内容,更多关于python 代码性能分析的资料请关注编程网其它相关文章!
--结束END--
本文标题: python如何做代码性能分析
本文链接: https://lsjlt.com/news/10487.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0