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开发工具,…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
