Python 性能优化:从入门到精通的实用指南
Langchain系列文章目录
01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
python系列文章目录
01-Python 基础语法入门:从变量到输入输出,零基础也能学会!
02-Python 流程控制终极指南:if-else 和 for-while深度解析
03-Python 列表与元组全攻略:从新手到高手的必备指南
04-Python 字典与集合:从入门到精通的全面解析
05-Python函数入门指南:从定义到应用
06-Python 函数高级特性:从默认参数到闭包的全面解析
07-Python 模块与包:从零到自定义的全面指南
08-Python异常处理:从入门到精通的实用指南
09-Python 文件操作:从零基础到日志记录实战
10-Python面向对象编程入门:从类与对象到方法与属性
11-Python类的方法与属性:从入门到进阶的全面解析
12-Python继承与多态:提升代码复用与灵活性的关键技术
13-掌握Python魔法方法:如何用__add__和__len__自定义类的行为
14-python面向对象编程总结:从基础到进阶的 OOP 核心思想与设计技巧
15-掌握 Python 高级特性:深入理解迭代器与生成器
16-用 Python 装饰器提升效率:日志与权限验证案例
17-再也不怕资源泄漏!Python 上下文管理器,with语句全攻略
18-Python 标准库必备模块:math、random、os、json 全解析
19-Python 性能优化:从入门到精通的实用指南
文章目录
- Langchain系列文章目录
- python系列文章目录
- 前言
- 一、影响 Python 性能的因素
- 1.1 时间复杂度
- 1.1.1 为什么时间复杂度重要?
- 1.1.2 怎么优化时间复杂度?
- 1.2 空间复杂度
- 1.2.1 空间复杂度为啥关键?
- 1.2.2 怎么优化空间复杂度?
- 二、Python 性能优化技巧
- 2.1 避免重复计算
- 2.1.1 使用缓存机制
- 2.1.2 预计算和惰性计算
- 2.2 减少 IO 操作
- 2.2.1 批量处理数据
- 2.2.2 使用异步 IO
- 三、使用 `timeit` 模块测量代码性能
- 3.1 `timeit` 模块简介
- 3.1.1 为什么用 `timeit`?
- 3.2 如何使用 `timeit` 测量代码性能
- 3.2.1 命令行使用 `timeit`
- 3.2.2 在代码中使用 `timeit`
- 四、总结
前言
Hey,你有没有遇到过这样的情况:代码跑得太慢,CPU 风扇狂转,甚至内存直接爆满?在 Python 开发中,性能问题是个绕不过去的坎儿。无论是处理大数据、写爬虫,还是开发 Web 应用,优化性能都能让你的程序更快、更省资源。这篇文章的目标很简单:带你从零开始,搞懂影响 Python 性能的因素,学会几个超实用的优化技巧,还要教你怎么用 timeit
模块测测代码到底有多快。不管你是刚入门的小白,还是有点经验的开发者,这里都有干货等着你!
本文会聊三大块:
- 影响 Python 性能的“幕后黑手”:时间复杂度和空间复杂度。
- 优化代码的“锦囊妙计”:避免重复计算、减少 IO 操作。
- 性能检测的“秘密武器”:
timeit
模块。
准备好了吗?咱们这就开始!
一、影响 Python 性能的因素
性能优化得先知道问题出在哪儿,对吧?Python 虽然简单好用,但有些地方不注意就会拖慢速度。这部分咱们聊聊两个核心因素:时间复杂度和空间复杂度。
1.1 时间复杂度
时间复杂度听起来有点学术,其实就是“你的代码跑起来需要多久”。它跟数据量大小直接挂钩,数据越多,影响越明显。
1.1.1 为什么时间复杂度重要?
简单说,时间复杂度决定了一个算法的效率。比如你在列表里找个数,数据量小还好,可要是列表里有几百万条数据,效率低的算法能让你等到怀疑人生。
- 举个例子:用列表和集合找数字的区别。
# 列表找数字,时间复杂度 O(n) my_list = [1, 2, 3, 4, 5] if 3 in my_list: # 得一个个检查print("找到啦!")# 集合找数字,时间复杂度 O(1) my_set = {1, 2, 3, 4, 5} if 3 in my_set: # 直接定位,超快print("找到啦!")
- 关键点:列表是线性查找,时间复杂度是 O(n);集合用哈希表,平均时间复杂度是 O(1)。数据量越大,差距越明显。
1.1.2 怎么优化时间复杂度?
- 建议:需要频繁查找时,用集合(
set
)或字典(dict
)代替列表。 - 场景:比如去重、查重这种操作,集合简直是神器。
1.2 空间复杂度
时间跑得快还不够,内存用得少也很重要。空间复杂度就是“你的代码占了多少内存”。
1.2.1 空间复杂度为啥关键?
Python 自动管理内存,但用错了数据结构,内存照样吃紧。比如存一堆数字,用列表和生成器差别可不小。
- 举个例子:
# 列表存一百万个数,全都加载到内存 my_list = [i for i in range(1000000)] # 内存占用大# 生成器,边用边生成,内存几乎不占 my_gen = (i for i in range(1000000)) # 超省空间
- 关键点:列表把所有数据都存下来,空间复杂度 O(n);生成器只存当前值,空间复杂度接近 O(1)。
1.2.2 怎么优化空间复杂度?
- 建议:大数据场景下,优先用生成器或迭代器。
- 场景:比如读取大文件、处理流数据,用生成器能省下不少内存。
二、Python 性能优化技巧
知道了影响性能的因素,咱们得动手优化代码。这部分分享两个超实用的技巧:避免重复计算和减少 IO 操作。
2.1 避免重复计算
重复计算就像你炒菜时把同一个葱花切了十遍,太浪费时间!Python 里有些操作可以提前做好,省下不少力气。
2.1.1 使用缓存机制
缓存就是把算过的结果存起来,下次直接拿来用。Python 自带一个神器:functools.lru_cache
。
- 代码示例:优化递归计算斐波那契数列。
from functools import lru_cache@lru_cache(maxsize=128) # 缓存最多 128 个结果 def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(50)) # 超快!
- 关键点:没缓存时,递归会重复算好多次;加了缓存,直接查表,时间从“天文数字”变成“秒级”。
- 场景:递归函数、频繁调用的计算任务。
2.1.2 预计算和惰性计算
- 预计算:提前把结果算好,比如程序启动时把常用数据准备好。
- 惰性计算:用到时再算,用生成器就是典型例子。
def lazy_range(n):i = 0while i < n:yield i # 每次只生成一个数i += 1for num in lazy_range(1000): # 按需取值print(num)
- 建议:不常用的数据用惰性计算,常用的小数据用预计算。
2.2 减少 IO 操作
IO 操作(比如读文件、发网络请求)特别慢,减少它的次数能让代码飞起来。
2.2.1 批量处理数据
别一行行读文件,一次性读完再处理效率更高。
- 代码示例:
# 逐行读,IO 次数多 def process(line):print(line)with open('file.txt', 'r') as f:for line in f: # 每次都调用 IOprocess(line)# 一次性读,IO 次数少 with open('file.txt', 'r') as f:content = f.read() # 一次读完lines = content.splitlines()for line in lines:process(line)
- 关键点:批量操作把多次 IO 变成一次,速度提升明显。
- 场景:读写大文件、数据库操作。
2.2.2 使用异步 IO
网络请求多的时候,等一个完再发下一个太慢,用异步 IO 可以同时处理。
- 代码示例:用
asyncio
抓网页。import asyncio import aiohttpasync def fetch_url(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def main():urls = ['http://example.com', 'http://example.org']tasks = [fetch_url(url) for url in urls]results = await asyncio.gather(*tasks)print(results[0][:100]) # 只打印前 100 个字符asyncio.run(main())
- 关键点:异步 IO 让多个请求并行,特别适合爬虫或高并发任务。
- 场景:网络密集型任务。
三、使用 timeit
模块测量代码性能
优化完代码,怎么知道效果咋样?用 timeit
模块测一测就知道了!
3.1 timeit
模块简介
timeit
是 Python 自带的小工具,专门测小段代码的运行时间。它会重复跑代码取平均值,结果很靠谱。
3.1.1 为什么用 timeit
?
手动用 time.time()
测时间不准,因为系统负载会干扰。timeit
跑很多次,数据更稳定。
3.2 如何使用 timeit
测量代码性能
3.2.1 命令行使用 timeit
直接在终端跑,适合快速测试。
- 示例:测列表推导式的速度。
python -m timeit "sum([i for i in range(1000)])"
- 输出:类似“1000 loops, best of 5: 123 usec per loop”,表示平均每次多久。
- 建议:调试小代码时用这个,简单又快。
3.2.2 在代码中使用 timeit
想在脚本里测?也很简单。
- 代码示例:
import timeitdef my_function():return sum([i for i in range(1000)])# 跑 100 次,测总时间 execution_time = timeit.timeit(my_function, number=100) print(f"总耗时: {execution_time} 秒")
- 关键点:
number
是运行次数,自己调,别设太大跑不动。 - 场景:对比不同实现方案的性能。
四、总结
本文聊了 Python 性能优化的三大块:
- 影响因素:时间复杂度管速度,空间复杂度管内存,选对数据结构很关键。
- 优化技巧:避免重复计算用缓存和生成器,减少 IO 用批量和异步。
- 测量工具:
timeit
帮你量化优化效果。
希望你看完能有所收获,赶紧把这些技巧用到自己的代码里吧!有什么问题,随时问我哦~
相关文章:
Python 性能优化:从入门到精通的实用指南
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

C# OPC DA获取DCS数据(提前配置DCOM)
OPC DA配置操作手册 配置完成后,访问远程ip,就能获取到服务 C#使用Interop.OPCAutomation采集OPC DA数据,支持订阅(数据变化)、单个读取、单个写入、断线重连...

xinference docker 部署方式
文章目录 简绍docker 安装方式访问地址对应官网在 dify 中 添加 xinference 容器内置大语言模型嵌入模型图像模型音频模型重排序模型视频模型 简绍 Xorbits Inference (Xinference) 是一个开源平台,用于简化各种 AI 模型的运行和集成。借助 Xinference,…...
基于Kubernetes部署MySQL主从集群
以下是一个基于Kubernetes部署MySQL主从集群的详细YAML示例,包含StatefulSet、Service、ConfigMap和Secret等关键配置。MySQL主从集群需要至少1个主节点和多个从节点,这里使用 StatefulSet 初始化脚本 实现主从自动配置。 1. 创建 Namespace (可选) ap…...

【Azure 架构师学习笔记】- Azure Databricks (17) --Delta Live Table和Delta Table
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (16) – Delta Lake 和 ADLS整合 前言 前面介绍了Delta Table,但是Databricks又推出了“Delta Live Tables(DLTs&…...
Mybatis Generator 使用手册
第一章 什么是Mybatis Generator? MyBatis Generator Core – Introduction to MyBatis Generator MyBatis生成器(MBG)是MyBatis框架的代码生成工具。它支持为所有版本的MyBatis生成代码,通过解析数据库表(或多个表&…...
快乐数 力扣202
一、题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&…...
SPA单页面应用优化SEO
1.SSR服务端渲染 将组件或页面通过服务器生成html,再返回给浏览器,如nuxt.js或vue-server-renderer const Vue require(vue); const server require(express)(); const renderer require(vue-server-renderer).createRenderer();const vueApp new …...

城市霓虹灯夜景拍照后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色教程 在城市霓虹灯夜景拍摄中,由于现场光线复杂等因素,照片可能无法完全呈现出当时的视觉感受。通过 Lr 调色,可以弥补拍摄时的不足。例如,运用基本调整面板中的曝光、对比度、阴影等工具,可以处理出画面的整体明暗…...
通领科技冲刺北交所
高质量增长奔赴产业新征程 日前,通领科技已正式启动在北交所的 IPO 进程,期望借助资本市场的力量,加速技术升级,推动全球化战略布局。这一举措不仅展现了中国汽车零部件企业的强大实力,也预示着行业转型升级的新突破。…...

隐私保护在 Facebook 用户身份验证中的应用
在这个数字化的时代,个人隐私保护成为了公众关注的焦点。社交媒体巨头 Facebook 作为全球最大的社交平台之一,拥有数十亿用户,其在用户身份验证过程中对隐私保护的重视程度直接影响着用户的安全感和信任度。本文将探讨 Facebook 在用户身份验…...
深度学习/强化学习调参技巧
深度调优策略 1. 学习率调整 技巧:学习率是最重要的超参数之一。过大可能导致训练不稳定,过小则收敛速度慢。可以使用学习率衰减(Learning Rate Decay)或自适应学习率方法(如Adam、RMSprop)来动态调整学习…...

python面试常见题目
1、python 有几种数据类型 数字:整形 (int),浮点型 (float)布尔 ( bool):false true字符串 (string)列表 (list)元组 (tuple)字典 &…...

echarts折线图设置背景颜色:X轴和Y轴组成部分背景色
echarts折线图设置背景颜色 关键代码 splitArea: {show: true,areaStyle: {color: [#F2F2F2],},},完整代码位置显示 yAxis: {type: value,boundaryGap: [0, 100%],max: 1,interval: 1,// 于设置y轴的字体axisLabel: {show: false, //这里的show用于设置是否显示y轴下的字体 默…...
文本处理Bert面试内容整理-BERT的应用场景有哪些?
BERT(Bidirectional Encoder Representations from Transformers)在多个自然语言处理(NLP)任务中表现出了强大的能力。由于其能够捕捉双向上下文信息和强大的迁移学习能力,BERT广泛应用于各种NLP场景。以下是BERT的一些典型应用场景: 1. 文本分类 文本分类任务旨在将文本…...

【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…...

manus对比ChatGPT-Deep reaserch进行研究类学术相关数据分析!谁更胜一筹?
没有账号,只能挑选一个案例 一夜之间被这个用全英文介绍全华班出品的新爆款国产AI产品的小胖刷频。白天还没有切换语言的选项,晚上就加上了。简单看了看团队够成,使用很长实践的Monica创始人也在其中。逐渐可以理解,重心放在海外产…...

20250307确认荣品PRO-RK3566开发板在Android13下的以太网络共享功能
20250307确认荣品PRO-RK3566开发板在Android13下的以太网络共享功能 2025/3/7 13:56 缘起:我司地面站需要实现“太网络共享功能”功能。电脑PC要像连接WIFI热点一样连接在Android设备/平板电脑上来实现上网功能/数据传输。 Android设备/平板电脑通过4G/WIFI来上网。…...
Unity Job系统详解原理和基础应用处理大量物体位置
概述 该脚本使用 Unity Job System 和 Burst Compiler 高效管理大量剑对象的位移计算与坐标更新。通过双缓冲技术实现无锁并行计算,适用于需要高性能批量处理Transform的场景。 核心类 SwordManager 成员变量 变量名类型说明swordPrefabGameObject剑对象预制体_d…...

高效编程指南:PyCharm与DeepSeek的完美结合
DeepSeek接入Pycharm 前几天DeepSeek的充值窗口又悄悄的开放了,这也就意味着我们又可以丝滑的使用DeepSeek的API进行各种辅助性工作了。本文我们来聊聊如何在代码编辑器中使用DeepSeek自动生成代码。 注:本文适用于所有的JetBrains开发工具,…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...