性能调优方面,经常要优化跑的最慢的代码,教你一种快速的方法
ztj100 2025-07-20 00:03 5 浏览 0 评论
在我们遇到性能问题的时候,很多时候需要去查看性能的瓶颈在哪里,本篇文章就是提供了多种常用的方案来监控函数的运行时间。
1.time
首先说明,time模块很多是系统相关的,在不同的OS中可能会有一些精度差异,如果需要高精度的时间测量,可以使用time.perf_counter。perf_counter仍然还是 基于时钟时间,很多因素会影响到它的精确度,比如机器负载。如果你对于执行时间更感兴趣,使用 time.process_time() 来代替它。 更多内容可以参考尾部的链接。
下面两个例子来源于《python cookbook》
装饰器模式1
import time
from functools import wraps
def timethis(func):
'''
Decorator that reports the execution time.
'''
@wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
end = time.perf_counter()
print(func.__name__, end-start)
return result
return wrapper
@timethis
def countdown(n):
"""
Counts down
"""
while n > 0:
n -= 1
countdown(100000)
装饰器模式2,上下文管理器
import time
from contextlib import contextmanager
@contextmanager
def timethis(label):
start = time.perf_counter()
try:
yield
finally:
end = time.perf_counter()
print('{}: {}'.format(label, end - start))
# Example use
with timethis('counting'):
n = 10000000
while n > 0:
n -= 1
2.timeit
python提供了timeit模块,这个可以在python console中直接使用
$ python -m timeit -n 4 -r 5 -s "import timing_functions" "timing_functions.random_sort(2000000)"
输出为:
4 loops, best of 5: 2.08 sec per loop
timeit在notebook中的使用
这个模块在ipython中使用起来相对简洁很多。
- %timeit, 这种方式可以测量单行代码。
- %%timeit, 这种方式可以测量整个cell的代码。
3.cprofile
上面的方法其实还是比较简单粗暴。profile模块是个更好的cProfile是profile的C实现,速度会更快。类似的包有pickle,也有个对应的Cpickle版本。 这个包可嵌入的代码中,类似下面这种:
import cProfile
cProfile.run("myfunction()")
我个人最喜欢的还是下面这种(下面的代码可能需要加一下PYTHONPATH):
$python -m cProfile -o output.pkl my_main_file.py
首先无需更改现有代码结构,其次可以将结果保存到output.pkl中。强烈建议将profile的结果保存起来,因为生产中有些profile可能耗时很长,而且控制台输出的内容有限,当你想从结果里面提取点重要信息,又要重新来过,特别耗时。
当获取上面的output.pkl的时候,可以进入python console,使用pstats得到结果:
import pstats
p = pstats.Stats('output.pkl') # 文件名
p.sort_stats('time') # 按照时间排序
p.print_stats(10) # 最耗时的前10个,如果没有参数,默认输出全部
- ncalls: 函数被call的次数
- tottime:函数总的耗时,但是不包括其子函数的耗时
- percall:tottime平均到每次调用的耗时
- cumtime:函数总的耗时,包括了其子函数的耗时(- 递归函数也不例外)
- percall:cumtime平均到每次调用的耗时
- filename:lineno(function) :每个函数各自的信息
4.line_profiler
看每一行执行的时间占比,也大概知道原因出在什么地方了。自带的profile会深入到包的底层运算逻辑,不是特别清晰。下面是line_profiler的使用方法,个人感觉比装饰器的方式好用太多:
from line_profiler import LineProfiler
import random
def do_stuff(numbers):
s = sum(numbers)
l = [numbers[i]/43 for i in range(len(numbers))]
m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
numbers = [random.randint(1,100) for i in range(1000)]
lp = LineProfiler()
lp_wrapper = lp(do_stuff) # 函数
lp_wrapper(numbers) # 参数
lp.print_stats()
line_profiler在notebook中使用
line_profiler在notebook的使用也超级方便,非常推荐。
%load_ext line_profiler
class A:
def to_profile_func():
pass
%lprun -f A.to_profile_func A.to_profile_func()
相关推荐
- 爬取电影视频数据(电影资源爬虫)
-
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。作者:yangrq1018原文链接:https://segmentfault.com/a/11900...
- Python效率倍增的10个实用代码片段
-
引言Python是一门功能强大且灵活的编程语言,广泛应用于数据分析、Web开发、人工智能等多个领域。它的简洁语法和高可读性让开发者能够快速上手,但在实际工作中,我们常常会遇到一些重复性或繁琐的任务。这...
- Python数据处理:深入理解序列化与反序列化
-
在现代编程实践中,数据的序列化与反序列化是数据持久化、网络通信等领域不可或缺的技术。本文将深入探讨Python中数据序列化与反序列化的概念、实现方式以及数据验证的重要性,并提供丰富的代码示例。...
- 亿纬锂能:拟向PKL买地,在马来西亚建立锂电池制造厂
-
亿纬锂能5月12日公告,亿纬马来西亚与PEMAJUKELANGLAMASDN.BHD.(PKL)签订《MEMORANDUMOFUNDERSTANDING》(谅解备忘录),亿纬马来西亚拟向PKL购买标的...
- 一个超强的机器学习库(spark机器学习库)
-
简介PyCaret...
- 30天学会Python编程:9. Python文件与IO操作
-
9.1文件操作基础9.1.1文件操作流程9.1.2文件打开模式表9-1Python文件打开模式...
- Python的Pickle序列化与反序列化(python反序列化json)
-
动动小手,点击关注...
- python进阶突破内置模块——数据序列化与格式
-
数据序列化是将数据结构或对象转换为可存储/传输格式的过程,反序列化则是逆向操作。Python提供了多种工具来处理不同场景下的序列化需求。一、核心内置模块...
- 微信聊天记录可视化工具详细介绍(微信聊天记录分析报告小程序)
-
功能概要能做什么...
- Python常用文件操作库使用详解(python中文件操作的相关函数有哪些)
-
Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能...
- Vue3+Django4全新技术实战全栈项目(已完结)
-
获课》aixuetang.xyz/5739/Django与推荐算法的集成及模型部署实践...
- 性能调优方面,经常要优化跑的最慢的代码,教你一种快速的方法
-
在我们遇到性能问题的时候,很多时候需要去查看性能的瓶颈在哪里,本篇文章就是提供了多种常用的方案来监控函数的运行时间。1.time首先说明,time模块很多是系统相关的,在不同的OS中可能会有一些精度差...
- Python解决读取excel数据慢的问题
-
前言:在做自动化测试的时候,我思考了一个问题,就是如果我们的测试用例随着项目的推进越来越多时,我们做自动化回归的时间也就越来越长,其中影响自动化测试速度的一个原因就是测试用例的读取问题。用例越多,所消...
- 【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
-
这是我的第364篇...
- 不会用mmdet工具?速看MMDetection工具的终极指南
-
来源:计算机视觉工坊添加微信:dddvisiona,备注:目标检测,拉你入群。文末附行业细分群...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)