Python 性能优化:从入门到精通的实用指南

devtools/2025/3/10 4:22:25/

Langchain系列文章目录

01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!

python_11">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 为什么时间复杂度重要?

简单说,时间复杂度决定了一个算法的效率。比如你在列表里找个数,数据量小还好,可要是列表里有几百万条数据,效率低的算法能让你等到怀疑人生。

  • 举个例子:用列表和集合找数字的区别。
    python"># 列表找数字,时间复杂度 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 自动管理内存,但用错了数据结构,内存照样吃紧。比如存一堆数字,用列表和生成器差别可不小。

  • 举个例子
    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

  • 代码示例:优化递归计算斐波那契数列。
    python">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 预计算和惰性计算

  • 预计算:提前把结果算好,比如程序启动时把常用数据准备好。
  • 惰性计算:用到时再算,用生成器就是典型例子。
    python">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 批量处理数据

别一行行读文件,一次性读完再处理效率更高。

  • 代码示例
    python"># 逐行读,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 抓网页。
    python">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

想在脚本里测?也很简单。

  • 代码示例
    python">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 帮你量化优化效果。

希望你看完能有所收获,赶紧把这些技巧用到自己的代码里吧!有什么问题,随时问我哦~



http://www.ppmy.cn/devtools/165921.html

相关文章

Linux 命令 for循环

for 循环 遍历列表 for fruit in apple banana orange do echo "I like $fruit" done 遍历文件 for file in *.txt do echo "Processing $file" cp "$file" backup/ done 数字范围&#xff08;使用 seq 或 {start..end}&#xff09; # 1到…

信奥赛CSP-J复赛集训(模拟算法专题)(2):P7071 [CSP-J2020] 优秀的拆分

信奥赛CSP-J复赛集训&#xff08;模拟算法专题&#xff09;&#xff08;2&#xff09;&#xff1a;P7071 [CSP-J2020] 优秀的拆分 题目描述 一般来说&#xff0c;一个正整数可以拆分成若干个正整数的和。 例如&#xff0c; 1 1 11 11&#xff0c; 10 1 2 3 4 101234 101…

Refreshtoken 前端 安全 前端安全方面

网络安全 前端不需要过硬的网络安全方面的知识,但是能够了解大多数的网络安全,并且可以进行简单的防御前两三个是需要的 介绍一下常见的安全问题,解决方式,和小的Demo,希望大家喜欢 网络安全汇总 XSSCSRF点击劫持SQL注入OS注入请求劫持DDOS 在我看来,前端可以了解并且防御前…

SQL Server 数据库迁移到 MySQL 的完整指南

文章目录 引言一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据 二、迁移工具的选择2.1 使用 MySQL Workbench2.2 使用第三方工具2.3 手动迁移 三、迁移步骤3.1 导出 SQL Server 数据库结构3.2 转换数据类型和语法3.3 导入 MySQL 数据库3.4 迁移数据3.5 迁移存…

利用PHP爬虫根据关键词获取17网(17zwd)商品列表:实战指南

在电商领域&#xff0c;通过关键词搜索商品并获取商品列表是常见的需求。17网&#xff08;17zwd&#xff09;作为知名的电商平台&#xff0c;提供了丰富的商品资源。本文将详细介绍如何使用PHP爬虫技术根据关键词获取17网商品列表&#xff0c;并确保爬虫行为符合平台规范。 一…

办公楼电动车违停乱象的智能化解决方案

随着城市化进程的加速&#xff0c;非机动车尤其是电动车已成为人们日常出行的重要工具。然而&#xff0c;办公楼下等非机动车集中停放区域的电瓶车违停现象日益严重&#xff0c;不仅影响了城市形象&#xff0c;更可能引发交通堵塞、安全隐患等问题。为解决这一难题&#xff0c;…

Springboot 梳理

一、Springboot 特性 方便创建可独立运行的spring应用程序直接内嵌Tomcat等服务简化了项目的构建配置为spring及第三方库提供自动配置提供生产级特性无需生成代码或者进行xml配置 二、四大核心 自动配置起步依赖命令行界面Actuator - 生成级的特性 三、自动配置的实现原理 …

Android AudioFlinger(四)—— 揭开PlaybackThread面纱

前言&#xff1a; 继上一篇Android AudioFlinger&#xff08;三&#xff09;—— AndroidAudio Flinger 之设备管理我们知道PlaybackThread继承自Re’fBase&#xff0c; 在被第一次引用的时候就会调用onFirstRef&#xff0c;实现如下&#xff1a; void AudioFlinger::Playbac…