本文共 650 字,大约阅读时间需要 2 分钟。
我可以在我的Q6600(Python 2.6.2)上再现这个。将范围增加到100000000:
('+=', 11.370000000000001)
('-=', 10.769999999999998)
首先,一些意见:
>这是一个小的操作的5%。这很重要。
>本机加法和减法操作码的速度是不相关的。它在噪底,与字节码评估完全相比。这是指一两个本地指令约千。
>字节码生成的指令数量完全相同;唯一的区别是INPLACE_ADD与INPLACE_SUBTRACT和1 vs -1。
看看Python源代码,我可以猜测。这在ceval.c中处理,在PyEval_EvalFrameEx中。 INPLACE_ADD有一个重要的额外代码块,用于处理字符串连接。该块不存在于INPLACE_SUBTRACT中,因为您不能减去字符串。这意味着INPLACE_ADD包含更多的本地代码。根据(非常重要)关于编译器如何生成代码,这个额外代码可能与INPLACE_ADD代码的其余部分是一致的,这意味着添加可以击中指令缓存比减法更难。这可能导致额外的L2高速缓存命中,这可能导致显着的性能差异。
这在很大程度上取决于你所使用的系统(不同的处理器有不同数量的缓存和缓存架构),使用的编译器,包括特定的版本和编译选项(不同的编译器将决定不同的代码位在关键路径,其确定如何将汇编代码汇集在一起),等等。
此外,Python 3.0.1(:15.66, – :16.71)中的区别是相反的;毫无疑问这个关键功能发生了很大变化。
转载地址:https://blog.csdn.net/weixin_33800724/article/details/113506388 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!