zoukankan      html  css  js  c++  java
  • 8.4 创建大量对象时节省内存方法:

    8.4 创建大量对象时节省内存方法:
    
    
    你的程序要创建大量(可能上百万)的对象,导致占用很大的内存;
    
    对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加__slots__属性来极大的减少实例
    
    所占的内存:
    
    当你定义  __slots__ 后,Python就会为实例使用一种更加紧凑的内部表示。 实例通过一
    个很小的固定大小的数组来构建,而不是为每个实例定义一个字典,这跟元组或列表很类
    似。 在  __slots__ 中列出的属性名在内部被映射到这个数组的指定小标上。 使用slots一
    个不好的地方就是我们不能再给实例添加新的属性了,只能使用在  __slots__ 中定义的那
    些属性名
    
    
    class Date(object):
      __slots__ = ['year','month','day']
      def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day
    s=Date('a','b','c')
    print s
    print type(s)
    # s.address='aa'
    # print s.address
    
    C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a25.py
    <__main__.Date object at 0x026AF968>
    <class '__main__.Date'>
    
    Process finished with exit code 0
    
    class Date(object):
      __slots__ = ['year','month','day']
      def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day
    s=Date('a','b','c')
    print s
    print type(s)
    s.address='aa'
    print s.address
    
    C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a25.py
    Traceback (most recent call last):
    <__main__.Date object at 0x0255F940>
      File "C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a25.py", line 10, in <module>
        s.address='aa'
    <class '__main__.Date'>
    AttributeError: 'Date' object has no attribute 'address'
    
    Process finished with exit code 1
    
    
    关于  __slots__ 的一个常见误区是它可以作为一个封装工具来防止用户给实例增加新的属
    性。 尽管使用slots可以达到这样的目的,但是这个并不是它的初衷。  __slots__ 更多的
    是用来作为一个内存优化工具。

  • 相关阅读:
    迭代器和生成器
    20.03.23作业
    装饰器
    集合
    元组类型
    字典类型
    列表类型
    字符串类型
    for循环
    深浅copy与while循环
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349437.html
Copyright © 2011-2022 走看看