全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python中的__slots__示例详解

前言

相信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__也是有副作用的:

  1. 每个继承的子类都要重新定义一遍__slots__
  2. 实例只能包含哪些在__slots__定义的属性,这对写程序的灵活性有影响,比如你由于某个原因新网给instance设置一个新的属性,比如instance.a = 1, 但是由于a不在__slots__里面就直接报错了,你得不断地去修改__slots__或者用其他方法迂回的解决
  3. 实例不能有弱引用(weakref)目标,否则要记得把__weakref__放进__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小时内与您取得联系。