Python类的动态绑定实现原理
作者:luoheng 发布时间:2022-05-02 00:52:03
使用实例引用类的属性时,会发生动态绑定。即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,只有一次动态绑定,通过对两个循环计时,测试动态绑定的代价。
输出结果:
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. 动态绑定实时跟踪类方法的变动,更具灵活性。
来源:https://www.cnblogs.com/luoheng23/p/10989435.html
猜你喜欢
- 我使用“ Web 2.0设计”来形容目前占主导优势的网页设计风格, 很多人用这个词来形容:网络经济的复苏网站和用户之间更高水平的交互或一种社
- 在你自己安装了一个新的MySQL服务器后,你需要为MySQL的root用户指定一个目录(缺省无口令),否则如果你忘记这点,你将你的MySQL
- Python实现八大排序算法,具体内容如下1、插入排序描述插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个
- 印刷和网络是不一样的。传统的布局排版并不适于网络,因为传统的印刷布局,几乎只想要什么样的平面效果都能很好的达到,但在网络上设计就很困难,尽管
- 数组编程使用Numpy数组可以使你利用简单的数组表达式完成多项数据操作任务,而不需要编写大量的循环,这个极大的帮助了我们高效的解决问题。我们
- 递归是以相似的方式重复项目的过程。同样适用于编程语言中,如果一个程序可以让你调用同一个函数被调用的函数,递归调用函数内使用如下。func r
- 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流!为了保证在业务高峰期,线上系统也能保证一定的弹性和稳定性,最有效的方案就是进行服
- 不管是用import还是用from mmmm import *的方式导入模块,当程序运行之后,回头在看那个存储着mmmm.py文件的目录中,
- 内部/内嵌函数1、定义:在一个函数的函数体内使用关键字def关键字定义一个新的函数,这个新的函数就叫做内部/内嵌函数。2、注意点:内部函数的
- 1 random.choicepython random模块的choice方法随机选择某个元素foo = ['a',
- 无论使用int还是varchar,对于Status的多选查询都是不易应对的。举例,常规思维下对CustomerStatus的Enum设置如下
- 通常我们做统计图的时候需要借助组件来完成例如mschart,aspchart等但是这个类不需要任何组件,而且使用方便,本站测试可用:clsG
- 前言文章抄袭在互联网中普遍存在,很多博主都收受其烦。近几年随着互联网的发展,抄袭等不道德行为在互联网上愈演愈烈,甚至复制、黏贴后发布标原创屡
- python操作mongodb数据库# !/usr/bin/env python# -*- coding:utf-8 -*-"&q
- 如下所示:>> type(np.newaxis)NoneType>> np.newaxis == NoneTruen
- 创建项目首先打开Pycharm勾选I confirm that I have read and accept the terms of th
- ajax开发中, 常遇到下面的几种情况: 1 服务端需要返回一段普通文本给客户端 2 服务端需要返回一段HTML代码给客户端 3 服务端需要
- 使用 python manage.py createsuperuser创建超级用户时只能默认输入:用户名,邮箱,及密码来创建有的时候我们需要
- 本来想控制鼠标自动移动防止公司电脑自动休眠的策略,然而,实现了并没什么卵用,还是会休眠。但还是分享出来吧。win10的系统。首先要安装几个第
- 今天小编利用美丽的汤来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式