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 n
        return fibonacci(n-1) + fibonacci(n-2)
    
    print(fibonacci(50))  # 超快!
    
  • 关键点:没缓存时,递归会重复算好多次;加了缓存,直接查表,时间从“天文数字”变成“秒级”。
  • 场景:递归函数、频繁调用的计算任务。

2.1.2 预计算和惰性计算

  • 预计算:提前把结果算好,比如程序启动时把常用数据准备好。
  • 惰性计算:用到时再算,用生成器就是典型例子。
    def lazy_range(n):
        i = 0
        while i < n:
            yield i  # 每次只生成一个数
            i += 1
    
    for 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:  # 每次都调用 IO
            process(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 aiohttp
    
    async 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 timeit
    
    def 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 帮你量化优化效果。

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983680.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【银河麒麟高级服务器操作系统实例】虚拟机桥接网络问题分析及处理

更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer…

10 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar头像组件开发教程(一)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 目录 第一篇&#xff1a;Avatar 组件基础概念与设计1. 组件概述2. 接口设计2.1 形状类型定义2.2 尺寸类型定义2.3 组件属性接口 3. 设计原则4. 使用…

C++20 DR11:数组 `new` 可以推导出数组大小

文章目录 背景与动机C20 的改进示例代码编译器支持总结 在 C20 中&#xff0c;DR11 提案&#xff08;P1009R2&#xff09;引入了一项重要的语言特性改进&#xff1a;数组 new 表达式可以自动推导数组大小。这一改进极大地简化了动态数组的创建过程&#xff0c;使代码更加简洁易…

STM32-I2C通信外设

目录 一&#xff1a;I2C外设简介 二&#xff1a;I2C外设数据收发 三&#xff1a;I2C的复用端口 四&#xff1a;主机发送和接收 五&#xff1a;硬件I2C读写MPU6050 相关函数&#xff1a; 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…

OpenManus:开源版Manus的快速安装及使用「喂饭教程」

OpenManus&#xff1a;开源版Manus的快速安装及使用「喂饭教程」 OpenManus是什么&#xff1f;OpenManus的核心理念1. 安装2. 配置2.1 线上模型2.2 本地模型 3. 运行项目常见问题&#xff1a;如何设置项目执行的Steps&#xff1f; OpenManus是什么&#xff1f; OpenManus是由 …

专业工具,提供多种磁盘分区方案

随着时间的推移&#xff0c;电脑的磁盘空间往往会越来越紧张&#xff0c;许多人都经历过磁盘空间不足的困扰。虽然通过清理垃圾文件可以获得一定的改善&#xff0c;但随着文件和软件的增多&#xff0c;磁盘空间仍然可能显得捉襟见肘。在这种情况下&#xff0c;将其他磁盘的闲置…

【小技巧】百度网盘清除重复文件详细步骤

百度网盘内存空间清理——清除重复文件 1.点击左下角【工具】 2.选择文件管理 3.点击垃圾文件清理&#xff0c;选择扫描重复文件 4.根据需要进行重复文件清理或进行垃圾视频扫描、空文件夹扫描等清理操作 5.一键清理需要svip会员&#xff0c;但是我们可以根据重复文件检查结…

用数据唤醒深度好眠,时序数据库 TDengine 助力安提思脑科学研究

在智能医疗与脑科学快速发展的今天&#xff0c;高效的数据处理能力已成为突破创新的关键。安提思专注于睡眠监测与神经调控&#xff0c;基于人工智能和边缘计算&#xff0c;实现从生理体征监测、智能干预到效果评估的闭环。面对海量生理数据的存储与实时计算需求&#xff0c;安…

运行OpenManus项目(使用Conda)

部署本项目需要具备一定的基础&#xff1a;Linux基础、需要安装好Anaconda/Miniforge&#xff08;Python可以不装好&#xff0c;直接新建虚拟环境的时候装好即可&#xff09;&#xff0c;如果不装Anaconda或者Miniforge&#xff0c;只装过Python&#xff0c;需要确保Python是3.…

upload-labs文件上传

第一关 上传一个1.jpg的文件&#xff0c;在里面写好一句webshell 保留一个数据包&#xff0c;将其中截获的1.jpg改为1.php后重新发送 可以看到&#xff0c;已经成功上传 第二关 写一个webshell如图&#xff0c;为2.php 第二关在过滤tpye的属性&#xff0c;在上传2.php后使用b…

【微知】Centos如何迁移到Anolis系统的失败记录?(yum -y install centos2anolis、centos2anolis.py)

背景 本文记录如何从centos 8迁移到anolis系统。 详细步骤 下载迁移repo wget https://mirrors.openanolis.cn/anolis/migration/anolis-migration.repo -O /etc/yum.repos.d/anolis-migration.repo下载centos2anolis工具包 yum -y install centos2anolis安装额外工具包 …

Docker 安装 Nacos 2.1.1(单机版)

一、拉取镜像 docker pull nacos/nacos-server:v2.1.1 二、新建数据库 官网上下载 对应版本的 nacos zip 包&#xff0c;在 nacos\conf 目录下有 mysql脚本&#xff1a; 新建一个数据库 nacos_config&#xff0c;在数据库中依次执行 nacos-mysql.sql、1.4.0-ipv6_support-up…

大模型开发(五):P-Tuning项目——新零售决策评价系统(下)

P-Tuning项目——新零售决策评价系统&#xff08;下&#xff09; 0 前言1 P-Tuning原理2 数据处理 0 前言 上篇文章我们介绍了使用PET方式微调BERT模型&#xff0c;PET属于提示词微调的一种&#xff0c;另一种比较常见的提示词微调是P-Tuning&#xff0c;我们今天在相同的项目…

.net 与 Pythonnet库的使用心得

python脚本使用.net 准备工作 安装pythonnet库 pip install pythonnet 查看是否安装了clr库 pip list | findstr clr 如果报错 module clr has no attribute AddReference 卸载clr pip uninstall clr 测试脚本 import clr clr.AddReference(System.Windows.Forms) from Syste…

Geo3D建筑材质切换+屋顶纹理

一、简介 基于Threejs开发封装建筑渲染管线&#xff0c;利用简单二维建筑矢量面轮廓程序化生成3D建筑&#xff0c;支持材质一键切换&#xff0c;支持多样化建筑墙面材质和屋顶材质&#xff0c;支持建筑透明&#xff0c;支持地形高程适配&#xff0c;支持按空间范围裁剪挖洞等。…

Windows 系统 Docker Desktop 入门教程:从零开始掌握容器化技术

文章目录 前言一、Docker 简介二、Docker Desktop 安装2.1 系统要求2.2 安装步骤 三、Docker 基本概念四、Docker 常用命令五、实战&#xff1a;运行你的第一个容器5.1 拉取并运行 Nginx 容器5.2 查看容器日志5.3 停止并删除容器 六、总结 前言 随着云计算和微服务架构的普及&…

以太网口的协议与电路波形

一直有一个疑问&#xff0c;MCU通过SPI协议与一个以太网芯片通信&#xff0c;这个芯片直接将其转化为了以太网所需的电平和协议标准&#xff0c;这其中发生了什么&#xff0c;开发者有需要关注哪些方面呢&#xff1f; 先看以太网模块的设计&#xff1a; 可以看到也是MCU和以太…

Uniapp 页面返回不刷新?两种方法防止 onShow 触发多次请求!

目录 前言1. 变量&#xff08;不生效&#xff09;2. 延迟&#xff08;生效&#xff09; 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 在 Uniapp 中&#xff0c;使用 onShow() 钩子来监听页面显示&#xff0…

数据结构--【顺序表与链表】笔记

顺序表 template <class T> class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类 //公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员&#xff0c;受保护成员在 arrList 类中仍然是受保护成员。 { …

LeetCode1137 第N个泰波那契数

泰波那契数列求解&#xff1a;从递归到迭代的优化之路 在算法的世界里&#xff0c;数列问题常常是我们锻炼思维、提升编程能力的重要途径。今天&#xff0c;让我们一同深入探讨泰波那契数列这一有趣的话题。 泰波那契数列的定义 泰波那契序列 Tn 有着独特的定义方式&#xf…