Python类的动态绑定实现原理


Posted in Python onMarch 21, 2020

使用实例引用类的属性时,会发生动态绑定。即python会在实例每次引用类属性时,将对应的类属性绑定到实例上。

动态绑定的例子:

class A:
  def test1(self):
    print("hello")
  
  def test2(self):
    print("world")

def bound():
  a = A()
  a.test1()
  A.test1 = A.test2
  a.test1()

if __name__ == "__main__":
  bound()

输出结果:

hello2 world

从上述代码中可以看到,类方法的变化是实时影响实例对方法的调用的,这说明python是在实例调用方法的过程中动态地查找类方法。

动态绑定的代价:

class A:
  def test(self):
    pass
def one_loop(limited_time):
  a = A()
  for i in range(limited_time):
    a.test()
  f = a.test
  for i in range(limited_time):
    f()

上图两个循环中,一个调用a.test(),不断进行动态绑定,另一个则先把a.test赋值给f,只有一次动态绑定,通过对两个循环计时,测试动态绑定的代价。

输出结果:

Python类的动态绑定实现原理

1 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0009999275207519531, 0.008995771408081055, 0.19991111755371094, 1.2715933322906494, 15.831915855407715]
2 [0.0, 0.0, 0.0, 0.0, 0.0, 0.12503726671039295, 0.09472344399590288, 0.1999776288967874, 0.131608969147562, 0.1553209370384522]

折线图中横坐标为log10(循环次数),纵坐标为秒数。

输出数据中,第一行为动态绑定和一次绑定耗费时间的差值,第二行为差值占动态绑定总时间的比例。

可以看出,在次数很小的时候,两者基本没有差距,或者说差距忽略不计。

在10^7次循环,即千万次循环的时候,动态绑定与静态绑定的耗费时间才出现了明显差异,当循环次数达到十亿级的时候,耗费时间相差15秒之多,约占总时间的15%。

由上可知,动态绑定效率低于静态绑定,但由于绑定代价耗时很少,在次数很少的时候基本没有影响。

动态绑定的优点:

class A:
  def test_hello(self):
    print("hello")

def test_world(self):
  print("world")

def main():
  s = A()
  # 提前绑定
  f = s.test_hello
  # 改变方法
  A.test_hello = test_world
  f()
  # 动态绑定
  s.test_hello()

if __name__ == "__main__":
  main()

输出结果:

hello2 world

类方法的变动能够实时反应在动态绑定上,而提前绑定则无法感知到类方法的变动。

总结:

1. 一次动态绑定代价很小,当绑定次数少的时候基本不影响效率,当绑定次数达到千万级时影响才会很显著。

2. 动态绑定实时跟踪类方法的变动,更具灵活性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python操作MongoDB数据库PyMongo库使用方法
Apr 27 Python
python实现文本去重且不打乱原本顺序
Jan 26 Python
用yum安装MySQLdb模块的步骤方法
Dec 15 Python
python 迭代器和iter()函数详解及实例
Mar 21 Python
Python中对象的引用与复制代码示例
Dec 04 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
Feb 05 Python
Python numpy 点数组去重的实例
Apr 18 Python
Python基本socket通信控制操作示例
Jan 30 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
OpenCV灰度化之后图片为绿色的解决
Dec 01 Python
Python类和实例的属性机制原理详解
Mar 21 #Python
Python生成器常见问题及解决方案
Mar 21 #Python
Python作用域与名字空间原理详解
Mar 21 #Python
Python小整数对象池和字符串intern实例解析
Mar 21 #Python
Python描述符descriptor使用原理解析
Mar 21 #Python
Python如何省略括号方法详解
Mar 21 #Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 #Python
You might like
PHP cron中的批处理
2008/09/16 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
Python实现图像几何变换
2015/07/06 Python
详解Python字符串对象的实现
2015/12/24 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
个人自我鉴定写法
2013/11/30 职场文书
期终自我鉴定
2014/02/17 职场文书
义和团口号
2014/06/17 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
党风廉正建设责任书
2015/01/29 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
行政申诉状范文
2015/05/20 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
吃通javascript正则表达式
2021/04/21 Javascript
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android