Python开发者必看:内存优化的实战技巧

更多Python学习内容:ipengtao.com
Python是一种高级编程语言,以其易读性和强大的功能而广受欢迎。然而,由于其动态类型和自动内存管理,Python在处理大量数据或高性能计算时,内存使用效率可能不如一些低级语言。本文将介绍几种Python内存优化的技巧,并提供相应的示例代码,帮助在开发中更高效地管理内存。
了解内存使用情况
在优化内存使用之前,首先需要了解程序的内存使用情况。sys模块和psutil库可以监控内存使用。
使用sys模块
sys.getsizeof可以获取对象的内存大小。
import sysa = [1, 2, 3, 4, 5]
print(sys.getsizeof(a)) # 输出列表对象的内存大小
print(sys.getsizeof(a) + sum(sys.getsizeof(i) for i in a)) # 输出列表及其元素的总内存大小 使用psutil库
psutil是一个跨平台的库,用于获取系统和进程的运行信息。
import psutil# 获取当前进程的内存使用情况
process = psutil.Process()
print(process.memory_info().rss) # 输出当前进程的内存使用量 使用生成器减少内存使用
生成器是Python中的一种迭代器,通过yield关键字实现。与列表不同,生成器不一次性将所有元素加载到内存,而是按需生成元素,适用于处理大数据集。
示例:使用生成器读取大文件
def read_large_file(file_path):with open(file_path) as file:for line in file:yield line# 使用生成器读取文件
for line in read_large_file("large_file.txt"):print(line) 避免不必要的对象复制
在Python中,对象的赋值操作实际上是引用传递,而不是创建新对象。因此,避免不必要的对象复制可以节省内存。
示例:避免列表复制
# 不推荐:复制列表
a = [1, 2, 3, 4, 5]
b = a[:]# 推荐:引用列表
b = a 使用内存视图(memoryview)
memoryview是一个内置函数,可以在不复制对象的情况下操作大数据对象的切片。它适用于处理大规模的字节数据,如二进制文件或图像处理。
示例:使用memoryview操作字节数组
data = bytearray(b"hello world")
mview = memoryview(data)# 修改原始数据
mview[0] = ord('H')
print(data) # 输出:bytearray(b'Hello world') 使用数组和NumPy进行高效计算
Python的内置列表结构虽然灵活,但在处理大规模数值计算时效率不高。使用array模块或NumPy库可以显著提高内存和计算效率。
示例:使用array模块
import array# 创建整数数组
arr = array.array('i', [1, 2, 3, 4, 5])
print(arr) 示例:使用NumPy数组
import numpy as np# 创建NumPy数组
arr = np.array([1, 2, 3, 4, 5])
print(arr) 使用__slots__减少内存使用
在类定义中使用__slots__可以显式声明类的属性,避免为每个实例创建__dict__,从而减少内存使用。
示例:使用__slots__定义类
class MyClass:__slots__ = ['name', 'age']def __init__(self, name, age):self.name = nameself.age = ageobj = MyClass('Alice', 30)
print(obj.name, obj.age) 内存管理与垃圾回收
Python使用垃圾回收机制自动管理内存,但手动干预可以帮助优化内存使用。gc模块提供了接口来控制垃圾回收。
示例:手动触发垃圾回收
import gc# 触发垃圾回收
gc.collect() 使用缓存优化性能
使用缓存可以避免重复计算,优化内存和性能。Python的functools.lru_cache装饰器可以方便地实现函数级别的缓存。
示例:使用lru_cache实现缓存
from functools import lru_cache@lru_cache(maxsize=128)
def compute(x):return x * xprint(compute(4)) # 输出:16
print(compute(4)) # 输出:16(使用缓存) 内存优化工具
使用memory_profiler分析内存使用
memory_profiler是一个Python库,可以通过简单的装饰器分析函数的内存使用情况。
安装memory_profiler
pip install memory_profiler 示例:使用memory_profiler分析内存
from memory_profiler import profile@profile
def my_func():a = [1] * (10 ** 6)b = [2] * (2 * 10 ** 7)del breturn aif __name__ == '__main__':my_func() 运行代码,将输出每行代码的内存使用情况。
使用tracemalloc追踪内存分配
tracemalloc模块用于追踪Python程序的内存分配,帮助发现内存泄漏和优化内存使用。
示例:使用tracemalloc追踪内存分配
import tracemalloc# 启动内存分配追踪
tracemalloc.start()def my_func():a = [1] * (10 ** 6)b = [2] * (2 * 10 ** 7)del breturn amy_func()# 获取内存分配情况
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')print("[ Top 10 ]")
for stat in top_stats[:10]:print(stat) 总结
本文详细介绍了Python内存优化的多种技巧,包括使用生成器减少内存使用、避免不必要的对象复制、使用内存视图、数组和NumPy进行高效计算、使用__slots__减少内存使用、手动管理垃圾回收、使用缓存优化性能,以及使用内存优化工具分析内存使用情况。通过具体的示例代码,展示了这些方法在不同应用场景中的实际应用。掌握这些技巧,可以在开发过程中更高效地管理内存,提高程序的性能和稳定性。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

往期推荐
历时一个月整理的 Python 爬虫学习手册全集PDF(免费开放下载)
Python基础学习常见的100个问题.pdf(附答案)
学习 数据结构与算法,这是我见过最友好的教程!(PDF免费下载)
Python办公自动化完全指南(免费PDF)
Python Web 开发常见的100个问题.PDF
肝了一周,整理了Python 从0到1学习路线(附思维导图和PDF下载)
相关文章:
Python开发者必看:内存优化的实战技巧
更多Python学习内容:ipengtao.com Python是一种高级编程语言,以其易读性和强大的功能而广受欢迎。然而,由于其动态类型和自动内存管理,Python在处理大量数据或高性能计算时,内存使用效率可能不如一些低级语言。本文将介…...
Golang | Leetcode Golang题解之第214题最短回文串
题目: 题解: func shortestPalindrome(s string) string {n : len(s)fail : make([]int, n)for i : 0; i < n; i {fail[i] -1}for i : 1; i < n; i {j : fail[i - 1]for j ! -1 && s[j 1] ! s[i] {j fail[j]}if s[j 1] s[i] {fail[i…...
【ajax实战08】分页功能
本文章目标:点击上/下一页按钮,实现对应页面的变化 实现基本步骤: 一:保存并设置文章总条数 设置一个全局变量,将服务器返回的数据返回给全局变量 二:点击下一页,做临界值判断,并…...
基于Hadoop平台的电信客服数据的处理与分析②项目分析与设计---需求分析-项目场景引入
任务描述 需求分析是软件生命周期中一个非常重要的过程,它决定着整个软件项目的质量,也是整个软件开发的成败所在。本环节任务是完成软件需求规格说明书。 知识点 :软件需求规格说明书的编写 重 点 :软件需求规格说明书内容的…...
debug-mmlab
mmyolo bug1: MMYOLO for yolov5 instance segmentation on balloon dataset getting this error "ValueError: Key img_path is not in available keys. solution: pip install albumentations1.3.1 reference...
年轻人为什么那么爱喝奶茶?
作者 | 艾泊宇 为什么年轻人那么爱喝奶茶?答案很简单:对他们来说,奶茶之于年轻人,正如白酒之于中年人。 奶茶不仅仅是一种饮料,它已经演化成一种文化现象,代表着温暖和爱的象征,甚至在某种程度上…...
手写数组去重
方法1-判断相邻元素 function _deleteRepeat(arr){if(!Array.isArray(arr)){throw new Error(参数必须是数组)}let res[];// 使用slice创建arr的副本,并排序let sortArrarr.slice().sort((a,b)>a-b);for(let i0;i<sortArr.length;i){if(isortArr.length-1||s…...
Firewalld 防火墙
1. 概述 在 RHEL7 系统中,firewalld 防火墙取代了传统的 iptables 防火墙。iptables 的防火墙策略是通过内核层面的 netfilter 网络过滤器来处理的,而 firewalld 则是通过内核层面的 nftables 包过滤框架来处理。firewalld 提供了更为丰富的功能和动态更…...
Hive查询优化 - 面试工作不走弯路
引言:Hive作为一种基于Hadoop的数据仓库工具,广泛应用于大数据分析。然而,由于其依赖于MapReduce框架,查询的性能可能会受到影响。为了确保Hive查询能够高效运行,掌握查询优化技巧至关重要。在日常工作中,高…...
【VUE3】uniapp + vite中 uni.scss 使用 /deep/ 不生效(踩坑记录三)
vite 中使用 /deep/ 进行样式穿透报错 原因:vite 中不支持,换成 ::v-deep 或:deep即可...
容器部署rabbitmq集群迁移
1、场景: 因业务需要,要求把rabbitmq-A集群上的数据迁移到rabbitmq-B集群上,rabbitmq的数据包括元数据(RabbitMQ用户、vhost、队列、交换和绑定)和消息数据,而消息数据存储在单独的消息存储库中。 2、迁移要…...
DP:背包问题----0/1背包问题
文章目录 💗背包问题💛背包问题的变体🧡0/1 背包问题的数学定义💚解决背包问题的方法💙例子 💗解决背包问题的一般步骤?💗例题💗总结 ❤️❤️❤️❤️❤️博客主页&…...
React antd umi 监听当前页面离开,在菜单栏提示操作
需求是我这里有个页面,离开当前页面之后,需要在菜单栏显示个提示,也就是Tour const [unblock, setUnblock] useState<() > void>(() > () > {});const [next, setNext] useState();useEffect(() > {const unblockHandler…...
在 Windows PowerShell 中模拟 Unix/Linux 的 touch 命令
在 Unix 或 Linux 系统中,touch 命令被广泛用于创建新文件或更新现有文件的时间戳。不过,在 Windows 系统中,尤其是在 PowerShell 环境下,并没有内置的 touch 命令。这篇博客将指导你如何在 Windows PowerShell 中模拟 touch 命令…...
鸿蒙NEXT
[中国,东莞,2024年6月24日] 华为开发者大会(HDC)正式开幕,带来全新的 HarmonyOS NEXT、盘古大模型5.0等最创新成果,持续为消费者和开发者带来创新体验。 HarmonyOS NEXT 鸿蒙生态 星河璀璨 鸿蒙生态设备数…...
VUE3-Elementplus-form表单-笔记
1. 结构相关 el-row表示一行,一行分成24份 el-col表示列 (1) :span"12" 代表在一行中,占12份 (50%) (2) :span"6" 表示在一行中,占6份 (25%) (3) :offset"3" 代表在一行中,左侧margin份数 el…...
Analyze an ORA-12801分析并行 parallel 12801 实际原因
"ORA-06512: at "PKG_P_DATA", line 19639 ORA-06512: at "PKG_P_DATA", line 19595 ORA-06512: at "PKG_P_DATA", line 14471-JOB 调用 -ORA-12801: error signaled in parallel query server P009, instance rac2:dwh2 (2) Error: ORA-12…...
高级运维工程师讲述银河麒麟V10SP1服务器加固收回权限/tmp命令引起生产mysql数据库事故实战
高级运维工程师讲述银河麒麟V10SP1服务器加固收回权限/tmp命令引起生产MySql数据库事故实战 一、前言 作为运维工程师经常会对生产服务器进行安全漏洞加固,一般服务厂商、或者甲方信息安全中心提供一些安全的shell脚本,一般这种shell脚本都是收回权限&…...
昇思25天学习打卡营第09天|sea_fish
打开第九天,本次学习的内容为保存与加载,记录学习的过程。本次的内容少而且简单。 在训练网络模型的过程中,实际上我们希望保存中间和最后的结果,用于微调(fine-tune)和后续的模型推理与部署,因…...
flutter开发实战-Charles抓包设置,dio网络代理
flutter开发实战-Charles抓包设置 在开发过程中抓包,可以看到请求参数等数据,方便分析问题。flutter上使用Charles抓包设置。dio需要设置网络代理。 一、dio设置网络代理 在调试模式下需要抓包调试,所以需要使用代理,并且仅用H…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
