问题
当程序需要创建大量的实例时,那么程序就会占用大量的内存,我们想要节省内存的话该怎么做呢?
解决方案
在类中使用__slots__属性
class Date:
__slots__ = ['year', 'month', 'day']
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
讨论
1.当定义了__slots__属性时,python 就会针对实例采用一种更加紧凑的内部表示。不再让每个实例都创建一个__dict__字典,现在的实例是围绕着一个固定长度的小型数组来构建的,这和一个元组或者列表很相似。
2.在64位版本的python中,不使用__slots__保存一个单独的Date实例需要428个字节的内存;如果定义了,内存用量将下降到156字节。在一个需要同时处理大量Date实例的程序中,这将显著减少总的内存使用量。
3.尽管这看起来是一个非常有用的特性,但是在大部分代码中都应该尽量别使用它。因为python中有许多部分都依赖于传统的基于字典的实现。
4.误解:可以阻止用户为实例添加新的属性。尽管这的确是使用__slots__所带来的副作用,但这绝对不是__slots__的原本用意。相反。人们一直以来都把它当作一种优化工具。