当前位置: 首页 > news >正文

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种工具,敬请期待!

相关文章:

  • 装饰器模式深度解析:Java设计模式实战指南与动态功能扩展最佳实践
  • 《Go语言圣经》函数值、匿名函数递归与可变参数
  • NVIDIA开源Fast-dLLM!解析分块KV缓存与置信度感知并行解码技术
  • (链表:哈希表 + 双向链表)146.LRU 缓存
  • React Native【实战范例】弹跳动画菜单导航
  • 基于微信小程序的美食点餐订餐系统
  • 【Dify学习笔记】:RagFlow接入Dify基础教程
  • Flowise工作流引擎的本地部署与远程访问实践
  • Python 操作 MySQL 数据库
  • EfficientVLA:面向视觉-语言-动作模型无训练的加速与压缩
  • Linux——linux的基本命令
  • 全面掌握 C++ 基础:关键特性与进化
  • 深入理解 Git:从版本控制原理到企业级实践
  • 医疗AI大数据处理流程的全面解析:从数据源到应用实践
  • 【世纪龙科技】智能网联汽车装调仿真教学软件数智化赋能实训教学
  • 有方 N58 LTE Cat.1 模块联合 SD NAND 贴片式 TF 卡 MKDV1GIL-AST,打造 T-BOX 高性能解决方案
  • 解锁数据宝藏:数据挖掘之数据预处理全解析
  • react扩展
  • Flutter ListTile 深度解析
  • 一[3.4]、ubuntu18.04环境 利用 yolov8n-seg实现“列车轨道”区域分割,并提取正确的轨道线【全网最详细】
  • 响应式网页设计技术/seo案例分析
  • wordpress 缺点/seo视频教程我要自学网
  • 波波网站建设/如何快速搭建一个网站
  • 黑客零基础入门/seo优化服务价格
  • 临安做网站的公司/最近国内新闻
  • 福州php做网站/如何在手机上开自己的网站