news 2026/5/12 20:38:31

如何评估我的 Python 代码的内存消耗

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何评估我的 Python 代码的内存消耗

原文:towardsdatascience.com/how-i-assess-the-memory-consumption-of-my-python-code-7e890c0b2709

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/eaa4e890185571f8f4a0f13646802700.png

由作者在 Canva 中创建

我们过去在编写代码时总是关注性能。如果我们搜索“python performance”,很容易就能找到成千上万的文章。然而,我很少看到文章告诉我们如何优化代码的内存消耗。

当然,性能在编程中至关重要,但内存消耗将决定我们需要在硬件上花费多少钱。考虑一下,我们将在大型数据集上训练一个模型。我们可能需要一个拥有 64GB RAM 的大虚拟机来完成这项工作。然而,如果我们能够优化我们的代码,32GB RAM 可能就能达到相似的时间。在这种情况下,我们可能会在硬件资源上节省大量的成本。

在我能够优化我们的代码以减少内存消耗之前,我们需要一些有效的方法来衡量它。此外,通过了解衡量内存消耗的方法,我们将能够对其进行量化并建立基准。因此,在这篇文章中,我将介绍我用来利用的常见内存测量方法。

1. Python 内置的“获取大小”

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8768d4ebbe9800199c845e2bb6a3c354.png

由作者在 Canva 中创建

在介绍任何花哨的第三方库之前,你知道我们有一个可以测量变量内存消耗的 Python 内置函数吗?它位于sys模块中。

importsys x=[1,2,3,4,5]print(f"Size of list:{sys.getsizeof(x)}bytes")

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a19db42a9b4fa2b3ffac5d43b02dd160.png

在上面的代码中,函数sys.getsizeof(x)将直接给出列表x的内存消耗。然而,我们必须小心,这个函数只会返回变量的大小(在这种情况下,它是列表x),而不会包括它引用的项目(在这种情况下,是整数)。

如果你想了解更多关于这个函数的细节,请查看以下文章。

为什么 Python 消耗了这么多内存?

不管怎样,当我们只想比较和基准测试内存消耗时,这个函数可能就足够了。请看下面的例子。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b934e14efe5f5388bc8e6bdbbdf4770f.png

因此,项目(那些整数)在xy中是相同的,但作为一个集合,yx需要更多的内存。这已经足够了解信息了。

如果你对为什么集合比列表需要更多的内存感兴趣,请告诉我。我考虑在下次分享。

2. Pympler

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ffaade3f969893732c4f45827ff22a5b.png

由作者在 Canva 中创建

有时候,我们可能会想知道变量的实际大小。在这种情况下,sys.getsizeof()将非常不方便,因为它如果不包含“子项”,则不会包括容器类型的“子项”。不幸的是,大多数时候,我们可能需要处理 Python 中的容器类型变量,如列表或字典。

在这种情况下,第三方库Pympler将非常方便,我们可以轻松地测量变量的实际内存。

在我们可以使用它之前,我们需要从 PyPI 安装这个库。

$ pip install pympler

然后,使用其函数pympler.asizeof()的方式与sys.getsizeof()非常相似。

frompymplerimportasizeof x=[1,2,3,4,5]print(f"Total size of list including elements:{asizeof.asizeof(x)}bytes")

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/19ca2c0605407ebe23c09292fa2df7a9.png

请注意,大小为 264 字节,包括容器和项目,而前面的示例只有 104 字节,仅用于容器大小。

3. 内存分析器

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fac10a90068057eece51a567e6655d7b.png

由作者在 Canva 创建

当我们遇到更复杂的情况时,不幸的是,这可能是我们作为常规工作处理的大多数情况,上述两种方法可能不足以衡量内存消耗。我们可能对在整个执行过程中内存消耗的情况更感兴趣。比如说,我们想在函数执行期间监控内存使用情况。

在这种情况下,我们可以利用一些第三方库,例如内存分析器。我们还可以从 PyPI 再次安装它。

pip install memory_profiler

让我们尝试一个简单的示例,并使用内存分析器来测量内存消耗。

frommemory_profilerimportmemory_usagedefmy_function():a='Towards Data Science'*(10**7)returna mem_usage=memory_usage((my_function,))print(f"Memory usage:{max(mem_usage)-min(mem_usage)}MB")

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/692b96c44fbad94a1504504d858412cd.png

在上面的代码中,我们从memory_profiler模块导入了memory_usage函数。然后,我们可以创建一个示例函数my_function()并让它执行一些会消耗内存的计算。

之后,我们调用memory_usage()函数并将函数名传递给它。请注意,该函数接受一个元组作为其参数。该元组将函数名作为其第一个元素。在函数名之后,我们可以传递函数所需的参数。但所有参数都需要放入另一个嵌套元组中。

例如,如果需要将字符串作为参数传递给my_function(),我们可以这样做。

frommemory_profilerimportmemory_usage my_string="Towards Data Science"defmy_function(str_arg):a=str_arg*(10**7)returna mem_usage=memory_usage((my_function,(my_string,)))print(f"Memory usage:{max(mem_usage)-min(mem_usage)}MB")

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/34f97b10e46ec74b718ddce6a96b202c.png

好的。现在,让我们回到内存测量结果。我们已经测量了两次,内存消耗相似(184MB 和 190MB)。这正是我们所需要的!

你可能好奇为什么我们需要获取mem_usage的最大值和最小值以及它们的差值。实际上,memory_usage()函数将在函数执行期间监控当前进程的内存使用情况。在函数执行期间,它会非常频繁地记录内存使用状态。

我们可以轻松地显示内存使用状态。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6caf9c8071e6a4042d3fee4b97db7145.png

因此,在函数执行过程中,当前进程的内存使用量正在变化。由于此时只有一个函数在运行,内存变化可以大致认为是该函数的内存消耗。

摘要

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/374c32faf84ba11f24f5eee8db3a0eb1.png

由作者在 Canva 中创建

在本文中,我介绍了几种可以帮助我们测量 Python 代码内存消耗的常见方法。getsizeof()方法是一个易于访问和使用的内置方法,但它仅限于测量单个变量。此外,它只能对对象进行非常浅层的测量。相反,可以使用第三方库Pympler来测量变量的容器类型的确切大小。最后,我们可以使用内存分析器来测量进程的内存消耗。换句话说,它通常是一个需要被测量的函数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 17:29:51

YOLOv13涨点改进 | 全网独家创新首发、细节涨点篇 | TGRS 2025顶刊 | 引入 Hint 先验特征提示模块,突出潜在目标区域,缓解红外小目标特征丢失,即插即用万能模块,助力高效涨点

一、本文介绍 🔥本文给大家介绍使用 Hint 先验特征提示 思想引入 YOLOv13 目标检测框架,可以在检测前端为网络提供显式的先验提示信息,使模型在特征提取初期就重点关注潜在目标区域,从而缓解小目标在 Backbone 早期下采样过程中易被淹没和丢失的问题。Hint 基于局部对比与…

作者头像 李华
网站建设 2026/5/11 8:37:12

【毕业设计】SpringBoot+Vue+MySQL 中小社区疫情信息管理系统平台源码+数据库+论文+部署文档

摘要 在新冠疫情的持续影响下,社区作为基层防控的重要单元,亟需高效、精准的信息管理工具以应对疫情动态变化。传统的纸质登记和人工统计方式效率低下,易出现信息遗漏或重复录入问题,难以满足快速响应和数据共享的需求。中小社区尤…

作者头像 李华
网站建设 2026/5/9 15:44:22

Prompt工程进阶:掌握AI图像生成的核心调参技巧

Prompt工程进阶:掌握AI图像生成的核心调参技巧 关键词:Prompt工程、AI图像生成、核心调参技巧、图像风格、参数优化 摘要:本文围绕Prompt工程中AI图像生成的核心调参技巧展开。先介绍背景知识,帮助读者了解相关概念和文档结构。接着通过有趣故事引入核心概念,解释了Prompt…

作者头像 李华
网站建设 2026/5/9 8:05:28

以领码 SPARK 融合平台为支撑,构建新一代 SMB 智能化 DCMM 服务平台——让数据管理能力“评得准、建得起、跑得久、用得好”**

摘要(Abstract) 在“数据要素数字中国人工智能”多重战略背景下,数据已从支撑资源升级为关键生产要素。然而,大量中小企业(SMB)在推进数字化、智能化过程中,普遍存在数据基础薄弱、治理体系缺失…

作者头像 李华
网站建设 2026/5/11 13:11:20

20、数据处理:压缩、同步与正则匹配的实用指南

数据处理:压缩、同步与正则匹配的实用指南 在数据处理和存储过程中,文件的压缩、同步以及文本的搜索匹配是常见的操作。本文将详细介绍几种实用的工具和技术,包括 tar 、 zip 、 rsync 以及正则表达式相关的 grep 命令,帮助你更好地管理和操作数据。 tar 命令:…

作者头像 李华
网站建设 2026/5/10 2:49:07

基于SpringBoot+Vue的考试系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着信息技术的快速发展,传统考试管理模式已无法满足现代教育的高效化、智能化需求。考试管理系统的数字化升级成为教育信息化建设的重要组成部分。传统考试流程依赖纸质试卷和人工阅卷,效率低下且易出错,尤其在远程教育和在线学习普及的…

作者头像 李华