python基础===创建大量对象是节省内存方法
问题:
你的程序要创建大量(可能上百万) 的对象,导致占用很大的内存。
解决方案:
对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加__slots__属性来极大的减少实例所占的内存。比如:
class Date: __slots__ = ['year', 'month', 'day'] def __init__(self, year, month, day): self.year = year self.month = month self.day = day
当你定义__slots__ 后,Python 就会为实例使用一种更加紧凑的内部表示。实例通过一个很小的固定大小的数组来构建,而不是为每个实例定义一个字典,这跟元组或列表很类似。在__slots__ 中列出的属性名在内部被映射到这个数组的指定小标上。使用slots 一个不好的地方就是我们不能再给实例添加新的属性了,只能使用在__slots__ 中定义的那些属性名。
使用slots 后节省的内存会跟存储属性的数量和类型有关。不过,一般来讲,使用到的内存总量和将数据存储在一个元组中差不多。为了给你一个直观认识,假设你不使用slots 直接存储一个Date 实例,在64 位的Python 上面要占用428 字节,而如果使用了slots,内存占用下降到156 字节。如果程序中需要同时创建大量的日期实例,那么这个就能极大的减小内存使用量了。
尽管slots 看上去是一个很有用的特性,很多时候你还是得减少对它的使用冲动。Python 的很多特性都依赖于普通的基于字典的实现。另外,定义了slots 后的类不再支持一些普通类特性了,比如多继承。大多数情况下,你应该只在那些经常被使用到的用作数据结构的类上定义slots (比如在程序中需要创建某个类的几百万个实例对象)。
关于__slots__ 的一个常见误区是它可以作为一个封装工具来防止用户给实例增加新的属性。尽管使用slots 可以达到这样的目的,但是这个并不是它的初衷。__slots__更多的是用来作为一个内存优化工具。
- python如何为创建大量实例节省内存
- 8.4 创建大量对象时节省内存方法:
- python-24-如何派生类内置不可变类型并修改其实例化行为?如何为创建大量实例节省内存?
- [00804]创建大量对象时节省内存方法
- python_如何为创建大量实例节省内存?
- 深入学习Django源码基础3 - python提供的对象默认方法
- Java面向对象基础__方法、对象的内存模型
- JavaSE视频学习阶段性总结 三(类的组成,定义,构造方法;对象的创建,内存模型,参数传递)
- Python网络编程2:创建套接字和套接字对象的内建方法
- 跟踪由new创建的对象的所未释放的内存资源的方法
- JavaScript基础之创建对象的方法
- 关于java基础类型与引用类型内存存储问题,以及string.intern()方法(String两种创建方式的区别)
- Python3基础 __str__ print一个类的实例对象的时候 使用的魔法方法
- python 7-7 如何在环状数据结构中管理内存,标准库中的weakref,创建一种能访问对象但不能增加引用计数的对象
- Python 对象特殊方法:(一)对象创建与销毁
- Spark RDD编程(Python和Scala版本)----Spark中的RDD就是一个不可变的分布式对象集合,是一种具有兼容性的基于内存的集群计算抽象方法,Spark则是这个方法的抽象。 Spa
- 用Python中的__slots__缓存资源以节省内存开销的方法
- OC基础之创建OC对象类、成员/静态变量、对象/类方法
- C# 将内存中的datatable数据导出为Excel(方法二,创建Excel对象导出)
- javascript基础(this,工厂方法来创建对象,构造函数创建对象)(十六)