Python内存:一行代码减少一半内存占用

举报
知识浅谈 发表于 2022/06/28 23:55:11 2022/06/28
【摘要】 我们能强制解释器来指定类的列表对象使用__slots__命令: 把这个看完基本上就理解了 通过简单地添加元素,创建一个100,000的数组,并查看内存消耗: data = []for p in ran...

我们能强制解释器来指定类的列表对象使用__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)

也不可能动态给这个类添加新类变量,但是在这个例子中,这并不是必需的。

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

文章来源: englishcode.blog.csdn.net,作者:知识浅谈,版权归原作者所有,如需转载,请联系作者。

原文链接:englishcode.blog.csdn.net/article/details/84578122

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。