概述
如果程序处理的数据比较多、比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用的内存大小的场景,更容易发生问题。下面我就给出几个优化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中实例跟踪的大小。
>