美文网首页
Python3 - 创建大量对象时节省内存方法

Python3 - 创建大量对象时节省内存方法

作者: 惑也 | 来源:发表于2018-12-24 23:33 被阅读55次

问题

创建大量(可能上百万)的对象,导致占用很大的内存。

解决方案

对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加 __slots__ 属性,来极大的减少实例所占的内存。比如:

class Date(object):
    __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看上去是一个很有用的特性,一般情况下,尽量还是不推荐用,因为Python的很多特性都依赖于普通的基于字典的实现。

关于 __slots__ 的一个常见误区是将它作为一个封装工具来防止用户给实例增加新的属性。尽管使用__slots__可以达到这样的目的,但是这个并不是它的初衷。__slots__ 更多的是用来作为一个内存优化工具。

相关文章

  • Python-cookbook之类与对象(1)

    创建大量对象时节省内存方法 问题:你的程序要创建大量 可能上百万 的对象,导致占用很大的内存 对于主要是用来当...

  • Python3 - 创建大量对象时节省内存方法

    问题 创建大量(可能上百万)的对象,导致占用很大的内存。 解决方案 对于主要是用来当成简单的数据结构的类而言,你可...

  • 创建大量对象时节省内存方法

    问题 你的程序要创建大量 (可能上百万) 的对象,导致占用很大的内存。 解决方案 对于主要是用来当成简单的数据结构...

  • OOM常见case

    内存累积 瞬间创建大量小对象。 autoreleasepool 通常autoreleased对象是在runloop...

  • 设计模式之亨元 Flyweight

    重点 将已创建的对象保存在内存,避免相同的对象反复创建 场景 大量相似的对象缓冲池

  • 浅谈Object-C的内存管理

    在运行程序的过程中,需要创建大量的对象。对象从创建出来、使用之后,就需要对内存中的对象进行释放,不然内存中的...

  • 内存优化——内存抖动

    什么是内存抖动? 短时间内大量的对象被创建,导致可用内存不足,从而引起频繁gc回收对象,这种已用内存忽高忽低的现象...

  • 如何避免OOM总结

    摘自--胡凯 Memory Churn内存抖动,内存抖动是因为在短时间内大量的对象被创建又马上被释放。瞬间产生大量...

  • JVM-对象内存布局

    jvm-对象内存布局 对象内存结构概述 对象的创建过程: jvm将对象所在的class文件加载到方法区中 jvm读...

  • JVM内存分配机制详解学习笔记

    JVM对象创建过程详解 对象创建的主要流程: 划分内存的方法: 指针碰撞如果Java堆中内存是绝对规整的,所有用过...

网友评论

      本文标题:Python3 - 创建大量对象时节省内存方法

      本文链接:https://www.haomeiwen.com/subject/rkptlqtx.html