前言

相信Python老鸟都应该看过那篇非常有吸引力的Saving 9 GB of RAM with Python's slots 文章,作者使用了__slots__让内存占用从25.5GB降到了16.2GB。在当时来说,这相当于用一个非常简单的方式就降低了30%的内存使用,着实惊人。作者并没有提到他的业务特点和代码,那我们就基于《fluent python》中的例子来验证下是不是有这么厉害:
from __future__ import print_function
import resource
class A(object):
def __init__(self):
self.a = 'string'
self.b = 10
self.c = True
class B(object):
__slots__ = ['a', 'b', 'c']
def __init__(self):
self.a = 'string'
self.b = 10
self.c = True
def test(cls):
mem_init = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
l = []
for i in range(500000):
l.append(cls())
mem_final = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
del l
print('Class: {}:\n'.format(getattr(cls, '__name__')))
print('Initial RAM usage: {:14,}'.format(mem_init))
print(' Final RAM usage: {:14,}'.format(mem_final))
print('-' * 20)
if __name__ == '__main__':
import sys
test(globals()[sys.argv[1].upper()])
我们分别跑一下这2个类:
❯ python mem_test.py a Class: A: Initial RAM usage: 4,890,624 Final RAM usage: 200,454,144 -------------------- ❯ python mem_test.py b Class: B: Initial RAM usage: 4,919,296 Final RAM usage: 60,235,776
2种方法初始内存略有差别,但是由于这个差别和总内存量相比太小而忽略不计,结论就是:
使用slots可以让内存使用减少3.5倍!!# 通过 (200 - 4) / ((60 - 4) * 1.0) 计算得来
那么用slot就是非非常那个有必要吗?事实上500000个实例这种机会非常少见,用不用完全根据业务来决定,并不要以偏概全。因为(敲黑板了哈)使用__slots__也是有副作用的:
第三点有点难理解,我写个例子看看吧:
In [2]: %pycat ref_example.py from weakref import ref class A(object): __slots__ = ['b'] def __init__(self): self.b = 1 class B(object): __slots__ = ['b', '__weakref__'] def __init__(self): self.b = 1 In [3]: from ref_example import * In [4]: a = A() In [5]: r = ref(a) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-6-75a6d689c8b3> in <module>() ----> 1 r = ref(a) TypeError: cannot create weak reference to 'A' object In [6]: b = B() In [7]: r = ref(b) In [8]: r Out[8]: <weakref at 0x109199578; to 'B' at 0x10919f890>
所以实例不超过万级别的类,__slots__是不太值得使用的。
PS: 《fluent python》比我狠,说的是小于百万级别实例不值得使用。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# python3
# slots
# python
# Python类中的魔法方法之 __slots__原理解析
# python使用__slots__让你的代码更加节省内存
# Python中__slots__属性介绍与基本使用方法
# python中__slots__用法实例
# 在Python中使用__slots__方法的详细教程
# 用Python中的__slots__缓存资源以节省内存开销的方法
# python中的__slots__使用示例
# Python中的__SLOTS__属性使用示例
# Python __slots__的使用方法
# 的是
# 以偏概全
# 是有
# 都要
# 子类
# 不太
# 一遍
# 错了
# 比我
# 能有
# 这对
# 有必要
# 不超过
# 种方法
# 三点
# 这篇文章
# 谢谢大家
# 太小
# 看看吧
# 我写
相关文章:
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
实例解析Array和String方法
如何快速搭建响应式可视化网站?
如何用AWS免费套餐快速搭建高效网站?
建站VPS选购需注意哪些关键参数?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
如何选择CMS系统实现快速建站与SEO优化?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
如何通过多用户协作模板快速搭建高效企业网站?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何通过万网虚拟主机快速搭建网站?
大同网页,大同瑞慈医院官网?
教学网站制作软件,学习*后期制作的网站有哪些?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
C++中引用和指针有什么区别?(代码说明)
如何访问已购建站主机并解决登录问题?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
C#如何序列化对象为XML XmlSerializer用法
如何在阿里云虚拟主机上快速搭建个人网站?
如何做静态网页,sublimetext3.0制作静态网页?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
广东企业建站网站优化与SEO营销核心策略指南
简单实现Android文件上传
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
制作网站公司那家好,网络公司是做什么的?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
专业商城网站制作公司有哪些,pi商城官网是哪个?
股票网站制作软件,网上股票怎么开户?
内部网站制作流程,如何建立公司内部网站?
如何通过二级域名建站提升品牌影响力?
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何破解联通资金短缺导致的基站建设难题?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
如何选择美橙互联多站合一建站方案?
如何在服务器上三步完成建站并提升流量?
如何在万网ECS上快速搭建专属网站?
如何用PHP快速搭建高效网站?分步指南
如何通过商城自助建站源码实现零基础高效建站?
招贴海报怎么做,什么是海报招贴?
网站制作网站,深圳做网站哪家比较好?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何快速打造个性化非模板自助建站?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
如何在云指建站中生成FTP站点?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
*请认真填写需求信息,我们会在24小时内与您取得联系。