python函数中直接操作局部变量,操作一个实例中的属性,调用实例的方法来操作属性为何性能相差很大
谢邀,楼上的答案是不对的,对C来说成立,对Python来说不成立。Python的函数调用一开始就不是native的,而是用解释器模拟的,至少对CPython来说是这样。对Python来说你的程序当中所有的诡异开销都来源于__dict__的操作的消耗。我们知道Python并不是像C++一样静态链接,而是依靠动态的属性查找来完成操作的,比如说你实验的当中的t += 1对应的是t = t.__iadd__(1)t是个基本类型,基本类型的方法查找相对是比较高效的,因为基本类型没有__dict__,不过仍然说不上快而t.a += 1对应的是t.__dict__ = t.__dict__.__iadd__(1)这个操作当中整整多了一次字典查找和一次字典写入,这两个操作远远要比加法慢,所以这两个操作构成了这个语句当中性能最低的部分而你的第三个语句就更过分了,t.add(1)对应的其实是:m = getattr(t, \u0026#39;add\u0026#39;): t.__dict__ # 失败了 f = A.__dict__ # 成功了 f.__get__(t, A) # f有__get__方法,需要进行修饰 instancemethod(f, a, A) # 修饰为instancemethod, # 这样可以使用a.f()而不是a.f(a)m(): _call = m.__call__ # 特殊属性查找要比__dict__快那么一点点 _call(1): m.__func__(m.__self__, 1): # 最后的最后还执行了跟之前一样的语句 t.__dict__ = t.__dict__.__iadd__(1)这中间多使用了两次__dict__,还多了很多额外的操作。可见Python会将非常简单的语句解释成非常复杂的操作,这种解释方式提高了灵活性,但是大大降低了运行速度。对Python来说灵活性更重要一些,所以一般也不要在意它比C++慢一百倍这种事情了……
■网友
谢邀。函数调用有额外开销,需要把 CPU 寄存器状态保存到堆栈,在调用完后再恢复。并且由于执行的代码发生了跳转,CPU 的预测可能失效。部分语言可以通过 inline 机制来避免函数调用,也就避免了这些额外开销。Python 不会去做内联优化,也不推荐使用 getter / setter。最后,你遇到的问题那样处理是合适的。不要去关注慢了 4 倍,而应该关注具体慢了多少。一个 1 微秒的操作变成 4 微秒,确实慢了 4 倍。但在一次调用需要 1 毫秒时,它多了 3 微秒也没什么关系。
■网友
我来歪一个楼:同样的代码,用python3.5.1运行出来,消耗会小很多。
【python函数中直接操作局部变量,操作一个实例中的属性,调用实例的方法来操作属性为何性能相差很大】
推荐阅读
- 怎样成为一名合格的Python程序员?
- 孕妇到了预产期,小孩还没有入盆,请问是该等下去还是直接剖腹产
- python 爬虫,咋获得输入验证码之后的搜索结果
- python的html5lib这个库咋使用啊我在网上也没有找到相关文档
- |为了人气这么拼?千万网红钟婷为了流量,直接挂掉自己眉毛
- 为啥腾讯要关闭ios端的赞赏,而不是将支付费用直接乘以1.43倍
- 普通车|想买大型SUV就别等了这3款车现大降价,途昂直接优惠一辆卡罗拉
- 零基础入门学习啥语言好
- 哪个数据库,可以直接做数据透视图(navicat类的也可以)
- 为啥微信没有为安卓平板推出客户端
