我们能强制解释器来指定类的列表对象使用__slots__命令:
把这个看完基本上就理解了
通过简单地添加元素,创建一个100,000的数组,并查看内存消耗:
data = []for p in range(100000):data.append(DataItem("Alex", 42, "middle of nowhere"))snapshot = tracemalloc.take_snapshot()top_stats = snapshot.statistics('lineno')total = sum(stat.size forstatin top_stats)print("Total allocated size: %.1f MB" % (total / (1024*1024)))
我们不使用__slots__占用内存16.8MB,使用时占用6.9MB。这个操作当然不是最好的,但是确实代码改变的最小的。(Not 7 times of course, but it’s not bad at all, considering that the code change was minimal.)
现在的缺点。激活__slots__禁止所有元素的创建,包括__dict__,这意味着,例如,一下代码将结构转换成json将不运行:
deftoJSON(self):return json.dumps(self.__dict__)
这个问题很容易修复,它是足以产生dict编程方式,通过所有元素的循环:
deftoJSON(self):data = dict()for var inself.__slots__: data[var] = getattr(self, var)return json.dumps(data)
也不可能动态给这个类添加新类变量,但是在这个例子中,这并不是必需的。