zoukankan      html  css  js  c++  java
  • Python __slots__


    一、问题

    当代码要创建大量(上百万)对象,导致内存占用很大。


    二、解决方案

    给类添加__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__更多用来优化内存。



  • 相关阅读:
    关于JVM的一些想法
    hashMap理解以及jdk1.7、jdk1.8其中区别
    各数据库如何实现自增
    dubbo遇坑记录
    mysql建表语句问题
    @Configuration
    生成一个唯一的ID
    门面模式
    关于getClass().getClassLoader()
    元素链
  • 原文地址:https://www.cnblogs.com/keye/p/15702549.html
Copyright © 2011-2022 走看看