概述
如果程序处理的数据比较多、比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用的内存大小的场景,更容易发生问题。下面我就给出几个优化Python占用内存的几个方法。
说明:以下代码运行在Python3。
举个栗子
我们举个简单的场景,使用Python存储一个三维坐标数据,x,y,z。
Dict
使用Python内置的数据结构Dict来实现上述例子的需求很简单。
>>> ob = {'x':1, 'y':2, 'z':3}
>>> x = ob['x']
>>> ob['y'] = y
PYthon学习企鹅裙:88198-2657 领取python自动化编程资料教程
查看以下ob这个对象占用的内存大小:
>>> print(sys.getsizeof(ob))
240
PYthon学习企鹅裙:88198-2657 领取python自动化编程资料教程
简单的三个整数,占用的内存还真不少,想象以下,如果有大量的这样的数据要存储,会占用更大的内存。
| 数据量 | 占用内存大小 |
|---|---|
| 1 000 000 | 240 Mb |
| 10 000 000 | 2.40 Gb |
| 100 000 000 | 24 Gb |
Class
对于喜欢面向对象编程的程序员来说,更喜欢把数据包在一个class里。使用class使用同样需求:
class Point:
#
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
>>> ob = Point(1,2,3)
PYthon学习企鹅裙:88198-2657 领取python自动化编程资料教程
class的数据结构和Dict区别就很大了,我们来看看这种情况下占用内存的情况:
| 字段 | 占用内存 |
|---|---|
| PyGC_Head | 24 |
| PyObject_HEAD | 16 |
| _ weakref_ | 8 |
| _ dict_ | 8 |
| TOTAL | 56 |
关于 __weakref__(弱引用)可以查看这个 文档 ,对象的__dict__中存储了一些self.xxx的一些东西。从Python 3.3开始,key使用了共享内存存储, 减少了RAM中实例跟踪的大小。
>>> print(sys.getsizeof(ob), sys.getsizeof(ob.__dict__)) 56 112
| 数据量 |
|---|

本文介绍了优化Python内存占用的多种方法,包括使用Dict、Class、_slots_、Tuple、Namedtuple、Recordclass、Dataobject、Cython和Numpy。通过实例对比,展示了不同数据结构和优化手段对内存的影响,帮助开发者在处理大数据时减少内存消耗。
最低0.47元/天 解锁文章
1575

被折叠的 条评论
为什么被折叠?



