Python内存使用分析工具深度解析与实践指南(上篇)

文章目录

    • 引言
    • 1. sys.getsizeof()
      • 功能
      • 程序示例
      • 适用场景
    • 2. pandas.Series.memory_usage()
      • 功能
      • 程序示例
      • 适用场景
    • 3. pandas.Series.memory_usage(deep=True)
      • 功能
      • 程序示例
      • 适用场景
      • 注意事项
    • 4. pympler.asizeof()
      • 功能
      • 安装
      • 程序示例
      • 适用场景
    • 5. tracemalloc(标准库)
      • 功能
      • 程序示例
      • 适用场景
    • 结尾


引言

在Python编程领域,内存管理是保障程序高效稳定运行的关键环节。无论是处理海量数据的数据分析项目,还是对资源占用敏感的Web应用开发,深入了解程序的内存使用情况都是优化性能、避免内存溢出等问题的重要前提。Python提供了丰富多样的内存使用分析工具,它们各有特点与适用场景。接下来,我们通过两篇文章将对这些工具进行全面且深入的解析,并通过实际案例展示其使用方法与应用场景。

1. sys.getsizeof()

功能

sys.getsizeof()是Python标准库sys中的函数,用于返回单个对象的内存大小,但它不会递归统计引用对象的内存占用,仅计算对象自身在内存中的直接空间。比如对于列表,它只统计列表对象本身的头部信息等占用的内存,不涉及列表元素的内存。

程序示例

import sys# 查看整数对象内存大小
num = 10
print(f"整数对象 {num} 的内存大小: {sys.getsizeof(num)} 字节")
# 整数对象 10 的内存大小: 28 字节# 查看字符串对象内存大小
s = "Hello, World!"
print(f"字符串对象 {s} 的内存大小: {sys.getsizeof(s)} 字节")
# 字符串对象 Hello, World! 的内存大小: 54 字节# 查看列表对象内存大小
lst = [1, 2, 3, 4, 5]
print(f"列表对象 {lst} 的内存大小: {sys.getsizeof(lst)} 字节")
# 列表对象 [1, 2, 3, 4, 5] 的内存大小: 104 字节

适用场景

适用于快速查看基本数据类型或简单容器的浅层大小,当我们仅需了解对象本身的内存开销,不关注内部嵌套结构时,该函数能快速提供信息。例如在数据预处理阶段,快速估算数据对象本身的内存消耗。

2. pandas.Series.memory_usage()

功能

pandas.Series.memory_usage()pandas库中Series数据结构的方法,用于估算Series对象及其索引所占用的内存大小(默认不计算索引内存)。对于数据类型为object的元素,只计算引用对象的内存,不计算对象本身的内存占用。

程序示例

import pandas as pd# 整数类型Series内存使用
s1 = pd.Series([1, 2, 3, 4, 5])
print(f"整数类型Series的内存使用: {s1.memory_usage()} 字节")
#  整数类型Series的内存使用: 172 字节# 字符串类型Series内存使用
s2 = pd.Series(["apple", "banana", "cherry"])
print(f"字符串类型Series的内存使用: {s2.memory_usage()} 字节")
# 字符串类型Series的内存使用: 156 字节# 包含自定义对象的Series内存使用
class MyClass:def __init__(self, value):self.value = valueobj1 = MyClass(10)
obj2 = MyClass(20)
s3 = pd.Series([obj1, obj2])
print(f"包含自定义对象的Series的内存使用: {s3.memory_usage()} 字节")
# 包含自定义对象的Series的内存使用: 148 字节

适用场景

专门用于分析pandas库中Series数据结构的内存使用情况,在数据处理中,帮助了解Series对象的内存占用,以便进行内存优化或数据存储规划。

3. pandas.Series.memory_usage(deep=True)

功能

pandas.Series.memory_usage()类似,但deep=True时会深入对象内部估算内存,对于数据类型为object的元素,计算实际对象的内存使用情况,结果更准确,但计算成本更高。

程序示例

import pandas as pd# 包含字符串的Series内存使用对比
s1 = pd.Series(["a" * 1000, "b" * 1000, "c" * 1000])
print(f"未启用deep参数的内存使用: {s1.memory_usage()} 字节")
# 未启用deep参数的内存使用: 156 字节
print(f"启用deep参数的内存使用: {s1.memory_usage(deep=True)} 字节")
# 启用deep参数的内存使用: 3279 字节# 包含自定义对象的Series内存使用对比
class MyClass:def __init__(self, value):self.value = valueself.data = [i for i in range(1000)]obj1 = MyClass(10)
obj2 = MyClass(20)
s2 = pd.Series([obj1, obj2])
print(f"未启用deep参数的内存使用: {s2.memory_usage()} 字节")
# 未启用deep参数的内存使用: 148 字节
print(f"启用deep参数的内存使用: {s2.memory_usage(deep=True)} 字节")
# 启用deep参数的内存使用: 244 字节

适用场景

当需要精确统计Series对象及其内部所有对象的真实内存开销,尤其是处理包含复杂对象的Series时,该方法能提供准确的内存使用信息。

注意事项

深度计算内存会显著增加计算时间和资源消耗,在处理大规模Series数据时需谨慎使用,避免因计算成本过高影响程序性能。此外,对于一些特殊的对象类型或复杂的内存结构,该方法的计算结果可能仍存在一定误差。

4. pympler.asizeof()

功能

pympler.asizeof()函数可递归统计对象及其所有引用对象的总内存占用,支持复杂结构,相比sys.getsizeof()更准确,会遍历对象及其子对象,累加内存占用。

安装

uv add pympler

程序示例

from pympler import asizeof
import pandas as pd# 嵌套列表内存占用
nested_list = [[1, 2, 3], [4, 5, 6], [[7, 8, 9], [10, 11, 12]]]
print(f"嵌套列表的内存占用: {asizeof.asizeof(nested_list)} 字节")
# 嵌套列表的内存占用: 888 字节# 包含自定义对象的Series内存占用
class MyClass:def __init__(self, value):self.value = valueself.data = [i for i in range(1000)]obj1 = MyClass(10)
obj2 = MyClass(20)
series = pd.Series([obj1, obj2])
print(f"包含自定义对象的Series的内存占用: {asizeof.asizeof(series)} 字节")
# 包含自定义对象的Series的内存占用: 4104 字节

适用场景

适用于全面了解任意Python对象(包括复杂数据结构)实际内存占用的场景,在分析内存占用异常的复杂对象时非常有用。

5. tracemalloc(标准库)

功能

tracemalloc是Python 3.4+标准库中的模块,用于追踪程序内存分配的详细信息,适合调试内存泄漏问题,能记录内存分配的堆栈跟踪信息,定位内存分配源头。

程序示例

import tracemalloctracemalloc.start()
# ... 运行程序 ...snapshot1 = tracemalloc.take_snapshot()
# ... 调用内存泄漏的函数 ...
snapshot2 = tracemalloc.take_snapshot()top_stats = snapshot2.compare_to(snapshot1, 'lineno')print("[ 前10差异 ]")
for stat in top_stats[:10]:print(stat)

结果示例:

<frozen importlib._bootstrap>:716: size=8173 KiB (+4428 KiB), count=71332 (+39369), average=117 B
/usr/lib/python3.4/linecache.py:127: size=940 KiB (+940 KiB), count=8106 (+8106), average=119 B
/usr/lib/python3.4/unittest/case.py:571: size=298 KiB (+298 KiB), count=589 (+589), average=519 B
<frozen importlib._bootstrap>:284: size=1005 KiB (+166 KiB), count=7423 (+1526), average=139 B
/usr/lib/python3.4/mimetypes.py:217: size=112 KiB (+112 KiB), count=1334 (+1334), average=86 B
/usr/lib/python3.4/http/server.py:848: size=96.0 KiB (+96.0 KiB), count=1 (+1), average=96.0 KiB
/usr/lib/python3.4/inspect.py:1465: size=83.5 KiB (+83.5 KiB), count=109 (+109), average=784 B
/usr/lib/python3.4/unittest/mock.py:491: size=77.7 KiB (+77.7 KiB), count=143 (+143), average=557 B
/usr/lib/python3.4/urllib/parse.py:476: size=71.8 KiB (+71.8 KiB), count=969 (+969), average=76 B
/usr/lib/python3.4/contextlib.py:38: size=67.2 KiB (+67.2 KiB), count=126 (+126), average=546 B

适用场景

当怀疑程序存在内存泄漏,或需要了解程序运行时的内存分配模式时,tracemalloc能提供有力帮助。

结尾

以上介绍的5种Python内存使用分析工具各有特点。sys.getsizeof()可快速查看对象浅层大小;pandas相关方法专注于Series数据结构的内存分析;pympler.asizeof()能准确统计复杂对象的内存占用;tracemalloc则是调试内存泄漏的利器。在实际开发中,根据具体需求选择合适的工具,才能更好地分析和优化程序的内存使用。后续我们将继续介绍另外4种工具,敬请期待!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 使用 Requests 模块进行爬虫

目录 一、请求数据二、获取并解析数据四、保存数据1. 保存为 CSV 文件2. 保存为 Excel 文件打开网页图片并将其插入到 Excel 文件中 五、加密参数逆向分析1. 定位加密位置2. 断点调试分析3. 复制相关 js 加密代码&#xff0c;在本地进行调试&#xff08;难&#xff09;4. 获取 …

MySQL行转列、列转行

要达到的效果&#xff1a; MySQL不支持动态行转列 原始数据&#xff1a; 以行的方式存储 CREATE TABLE product_sales (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(50) NOT NULL,category VARCHAR(50) NOT NULL,sales_volume INT NOT NULL,sales_date DATE N…

云创智称YunCharge充电桩互联互通平台使用说明讲解

云创智称YunCharge充电桩互联互通平台使用说明讲解 一、云创智称YunCharge互联互通平台简介 云创智称YunCharge&#xff08;YunCharge&#xff09;互联互通平台&#xff0c;旨在整合全国充电桩资源&#xff0c;实现多运营商、多平台、多用户的统一接入和管理&#xff0c;打造开…

HTML+JS实现类型excel的纯静态页面表格,同时单元格内容可编辑

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>在线表格</title><style>table {border…

Gartner金融AI应用机会雷达-学习心得

一、引言 在当今数字化时代,人工智能(AI)技术正以前所未有的速度改变着各个行业,金融领域也不例外。财务团队面临着如何从AI投资中获取最大价值的挑战。许多首席财务官(CFO)和财务领导者期望在未来几年增加对AI的投入并从中获得更多收益。据调查,90%的CFO和财务领导者预…

像素着色器没有绘制的原因

背景 directX调用了 draw&#xff0c;顶点着色器运行&#xff0c;但是像素着色器没有运行。 原因 光栅化阶段被剔除 说明&#xff1a;如果几何图元&#xff08;如三角形&#xff09;在光栅化阶段被剔除&#xff0c;像素着色器就不会被调用。常见剔除原因&#xff1a; 背面…

jenkins对接、jenkins-rest

https://www.bilibili.com/video/BV1RqNRz5Eo6 Jenkins是一款常见的构建管理工具&#xff0c;配置好后操作也很简单&#xff0c;只需去控制台找到对应的项目&#xff0c;再输入分支名即可 如果每次只发个位数的项目到也还好&#xff0c;一个个进去点嘛。但如果一次要发几十个项…

北斗导航深度接入小程序打车:高精度定位如何解决定位漂移难题?

你有没有遇到过这样的尴尬&#xff1a; 在写字楼、地下车库或密集楼群中叫车&#xff0c;系统显示的位置和你实际所在位置差了几十米甚至上百米&#xff1b;司机因为找不到你而绕圈&#xff0c;耽误时间还多花平台费用&#xff1b;有时明明站在A出口&#xff0c;司机却跑到B口…

MySQL 主要集群解决方案

MySQL 主要有以下几种集群解决方案&#xff0c;每种方案针对不同的应用场景和需求设计&#xff1a; 1. MySQL Replication&#xff08;主从复制&#xff09; 类型&#xff1a;异步/半同步复制架构&#xff1a;单主多从特点&#xff1a; 读写分离&#xff0c;主库写&#xff0c…

基于vue3+express的非遗宣传网站

​ 一个课程大作业&#xff0c;需要源码可联系&#xff0c;可以在http://8.138.189.55:3001/浏览效果 前端技术 Vue.js 3&#xff1a;我选择了Vue 3作为核心前端框架&#xff0c;并采用了其最新的Composition API开发模式&#xff0c;这使得代码组织更加灵活&#xff0c;逻辑…

【7】图像变换(上)

本节偏难,不用过于深究 考纲 文章目录 可考题【简答题】补充第三版内容:图像金字塔2023甄题【压轴题】习题7.1【第三版】1 基图像2 与傅里叶相关的变换2.1 离散哈特利变换(DHT)可考题【简答题】2.2 离散余弦变换(DCT)2021甄题【简答题】2.3 离散正弦变换(DST)可考题【简…

WinUI3入门9:自制SplitPanel

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

【面板数据】上市公司投资者保护指数(2010-2023年)

上市公司投资者保护指数是基于上市公司年报中公开披露的多项内容&#xff0c;从信息透明度、公司治理结构、关联交易披露、控股股东行为规范等多个维度&#xff0c;评估企业是否在制度上和实际操作中有效保障投资者&#xff0c;特别是中小投资者的合法权益。本分享数据基于我国…

如何解决USB远距离传输难题?一文了解POE USB延长器及其行业应用

在日常办公、教学、医疗和工业系统中&#xff0c;USB接口设备扮演着越来越关键的角色。无论是视频采集设备、键盘鼠标&#xff0c;还是打印机、条码枪&#xff0c;USB早已成为主流连接标准。然而&#xff0c;USB原生传输距离的限制&#xff08;通常在5米以内&#xff09;常常成…

PostgreSQL(TODO)

(TODO) 功能MySQLPostgreSQLJSON 支持支持&#xff0c;但功能相对弱非常强大&#xff0c;支持 JSONB、索引、函数等并发控制行级锁&#xff08;InnoDB&#xff09;&#xff0c;不支持 MVCC多版本并发控制&#xff08;MVCC&#xff09;&#xff0c;性能更好存储过程/触发器支持&…

LINUX 623 FTP回顾

FTP 权限 /etc/vsftpd/vsftpd.conf anonymous_enableNO local_enableNO 服务器 .20 [rootweb vsftpd]# grep -v ^# vsftpd.conf anonymous_enableNO local_enableYES local_root/data/kefu2 chroot_local_userYES allow_writeable_chrootYES write_enableYES local_umask02…

leetcode:77. 组合

学习要点 学习回溯思想&#xff0c;学习回溯技巧&#xff1b;大家应当先看一下下面这几道题 leetcode&#xff1a;46. 全排列-CSDN博客leetcode&#xff1a;78. 子集-CSDN博客leetcode&#xff1a;90. 子集 II-CSDN博客 题目链接 77. 组合 - 力扣&#xff08;LeetCode&#x…

自定义主题,echarts系列嵌套

自定义主题&#xff0c;echarts系列嵌套&#xff0c;完善map地图系列与lines系列抛物线 自定义主题开发设计&#xff08;如传感器数据可视化&#xff09; 1.使用typetreemap自定义 TreeMap 主题&#xff08;矩形树图系列&#xff09; 2.在矩形树图中画typelines动态连线和typee…

速度与精度的结合:Faster R-CNN模型的性能剖析

目标检测作为计算机视觉领域的核心问题之一&#xff0c;其重要性随着深度学习技术的发展而日益凸显。本文深入探讨了基于深度学习的Faster R-CNN模型&#xff0c;这是一种革命性的目标检测框架&#xff0c;它通过引入区域提议网络&#xff08;Region Proposal Network, RPN&…

计算机网络--期末速通版

以下总结提纲来自于hcgg&#xff0c;伟大无需多言。socket编程没有写进去&#xff0c;Rdt的话我后来感觉可能只考概念&#xff0c;其余我感觉会考的部分都在里面了&#xff0c;如果有错误或者解释不清楚造成的疑问&#xff0c;希望大家及时指正&#xff0c;感谢。 应用层 DNS…