| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Python优化之__slots__ -> 正文阅读 |
|
[Python知识库]Python优化之__slots__ |
目录 类中的__dict__????????每个python类都是隐形的继承自object类,而object类中有一个自带的魔法函数__dict__,也就是说每个python类也都有这个__dict__方法。那么这个方法是干什么用的呢?先一起来试一下!
????????可以看到输出的结果是一个字典,key和value分别是 掀起字典的盖头来????????字典的底层结果是哈希表(Hash Table),字典中的每个键都占用一个单元(bucket), 一个单元分为两部分, 分别是对键的引用和对值的引用, 使用hash函数获得键的散列值, 散列值对数组长度取余, 取得的值就是存放位置的索引,举个小例子:
所以说,字典的内存开销实际是很大的,典型的用空间换时间。 说了这么多,其实是想论证,由于Python类使用了__dict__方法,所以在内存空间的消耗上必然也不少,尤其是多属性、创建多个对象的时候。那么有没有什么办法解决这个问题呢?答案就是本文的主题:__slots__ 开始主题:__slots__还是用文章开始的那个例子:
????????运行后我们会发现,第一个print可以正常输出结果:Jaxx,而运行到第二个print时却报错了: 这里我用到了一个统计运行内存的包:ipython_memory_usage ????????注意看底部的输出部分,没有使用__slots__时的内存使用为0.3438MB,而使用了之后的内存使用降低到了0.0156MB,足足3倍,不可谓不大!尤其是在多属性、多实例时我想这个差别应该会更大。 ????????在前面两节的中,我们知道了普通类是使用字典来管理属性,那么__slots__是通过什么方式来节省内存的呢? 为什么__slots__可以关于这一部分,我能力有限就不献丑了,可以看这位大佬的文章:python slots源码分析,简单来说就是在使用了__slots__之后,slots是直接存储在实例内存上面的,而属性的具体位置的偏移值信息则以member存储在类对象上。后续将会根据这个member创建具体的descriptior,而实际上读写这个属性都是通过descriptior实现的。相对于使用字典的方式来说,少了哈希的这一过程,所以属性的访问速度必然会更快一些了。 总结一下使用__slots__的优点:
在上面的代码中,构造函数中有一个实例属性name,在实例化类之后我们有增加了一个属性age并且成功赋值,在使用
代码增加了一行__slots__ = 'name',而运行结果就直接报错了: ?原理也很简单,因为__slots__是使用定长列表来存储的类属性,所以也就没办法直接在类外属性赋值了(也更符合封装的意义)。 更详细一点的使用方法上面的内容在使用__slots__时,因为属性都只用了一个来举例,所以直接__slots__ = 'name'就完成了,那么有多属性的时候呢?答案是使用List或者tuple,严格来说__slots__接受的值应该是可迭代的对象(字符串也属于可迭代的)。
需要注意的是,在父子类继承的时候的一些情况:
????????OK,现在已经把__slots__原理、对比、实际使用方法都大概的介绍了一遍,也算是自己的一个学习的过程吧!回过头来想想自己目前在用的接口测试框架,每条用例都会实例化一个requests对象(二次封装后的),这不正好可以进行优化吗?不多说了,我要去改了!! 后续计划本文的标题是《Python优化之__slots__》,而优化方法显然不止使用__slots__这一种。再加上目前公司的框架已经处于正常的运行维护期,需要考虑的就是各种的优化补充了,所以我的后续计划就是优化+文档输出,希望可以坚持下去! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 7:12:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |