用Python的 __slots__ 节省9G内存
2023-03-09 22:14:44 时间
我们曾经提到,Oyster.com的Python web服务器怎样利用一个巨大的Python dicts(hash table),缓存大量的静态资源。我们最近在Image类中,用仅仅一行__slots__代码,让每个6G内存占用的服务进程(共4个),省出超过2G来。
这是其中一个服务器在部署代码前后的截图:
physical-memory-usage-history
我们alloc了大约一百万个类似如下class的实例:
classImage(object): def__init__(self,id, caption, url): self.id=id self.caption=caption self.url=url self._setup() # ... other methods ...
默认情况下,Python用一个dict来存储对象实例的属性。这在一般情况下还不错,而且非常灵活,乃至你在运行时可以随意设置新的属性。
但是,对一些在”编译”前就知道该有几个固定属性的小class来说,这个dict就有点浪费内存了。而当你把这个小浪费乘上一百万,那可就大不同了。在Python中,你可以在class中设置__slots__,它是一个包含这些固定的属性名的list。这样Python就不会再使用dict,而且只分配这些属性的空间。
classImage(object): __slots__=['id','caption','url'] def__init__(self,id, caption, url): self.id=id self.caption=caption self.url=url self._setup() # ... other methods ...
你还可以用collections.namedtuple,它允许访问参数,但只占用一个tuple的空间。这跟__slots__类似。不过我总觉得继承一个namedtuple类很奇怪。另外,如果你需要自定义初始化,你应该重载__new__而不是__init__。
警告:不要贸然进行这个优化,把它用在所有地方。这种做法不利于代码维护,而且只有当你有数以千计的实例的时候才会有明显效果。
原文发布时间为:2013-12-03
本文来自云栖社区合作伙伴“Linux中国”
相关文章
- 软件测试|Python实用炫酷技能——推导式
- 软件测试|一步到位教会你Python字典操作(一)
- 软件测试|手把手教你使用Python获取B站视频选集内容
- 软件测试|手把手教你用Python来模拟绘制自由落体运动过程中的抛物线
- 软件测试|Pytest的必会技巧(一)
- 不想自己开车,Python帮你搞定自动驾驶
- Python用KShape对时间序列进行聚类和肘方法确定最优聚类数k可视化|附代码数据
- 1行Python代码,对话ChatGPT,网友:太方便了!
- Python标准模块:importlib详解
- python小技巧:冻结参数,让你的代码变简洁
- Python复杂排序闯5关,你能闯到第几关?
- Python 异步: 使用和查询任务(8)
- 画【Python折线图】的一百个学习报告(三、设置全局 Label 颜色)
- python为什么需要函数、类这些概念
- python中如何用列表+yield打破"内卷"的递归
- 如何使用pycrypt加密工具测试反病毒产品的检测性能
- Python 恶意软件 AndroxGh0st 开始窃取 AWS 密钥
- Pyramid:一款专为红队设计的EDR绕过工具
- Python 供应链攻击层出不穷,研究人员又发现一例
- 分布式事务 | 使用DTM 的Saga 模式