概述
如果程序处理的数据比较多、比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用的内存大小的场景,更容易发生问题。下面我就给出几个优化Python占用内存的几个方法。
说明:以下代码运行在Python3。
举个栗子
我们举个简单的场景,使用Python存储一个三维坐标数据,x,y,z。
Dict
使用Python内置的数据结构Dict来实现上述例子的需求很简单。
>>> ob = {'x':1, 'y':2, 'z':3}
>>> x = ob['x']
>>> ob['y'] = y
查看以下ob这个对象占用的内存大小:
>>> print(sys.getsizeof(ob))
240
简单的三个整数,占用的内存还真不少,想象以下,如果有大量的这样的数据要存储,会占用更大的内存。
数据量
占用内存大小
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)
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__))