不, 不是 。
CPython字节码的编译仅通过小型的猫眼优化器传递,该优化器仅用于基本优化(有关这些优化的更多信息,请参见测试套件中的test_peepholer.py)。
要查看实际发生的情况,请使用
dis*查看生成的指令。对于第一个函数,包含分配:
from dis import disdis(func) 20 LOAD_ConST 1 (42) 2 STORE_FAST 0 (a) 34 LOAD_FAST 0 (a) 6 RETURN_VALUE
而对于第二个功能:
dis(func2) 20 LOAD_ConST 1 (42) 2 RETURN_VALUE
第一个中使用了另外两个(快速)指令:
STORE_FAST和
LOAD_FAST。这些可以快速存储和获取
fastlocals当前执行帧数组中的值。然后,在两种情况下
RETURN_VALUE都执行a。所以,第二个是曾经如此
轻微 ,由于执行需要更少的命令更快。
通常,请注意CPython编译器在执行的优化中是 保守 的。它 并没有
像其他编译器一样聪明(通常也有更多的信息可以使用)。除了显然是正确的之外,主要设计目标是:a)保持简单,b)尽可能快地进行编译,因此您甚至不会注意到存在编译阶段。
最后,您不应该为像这样的小问题而烦恼。速度的好处是微小的,恒定的,并且与解释Python事实所带来的开销相形见war。
*
dis是一个小的Python模块,可反汇编您的代码,您可以使用它查看VM将执行的Python字节码。
注意: 正如@Jorn
Vernee的评论中所述,这特定于Python的CPython实现。如果其他实现愿意的话,其他实现可能会进行更积极的优化,而CPython则不会。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)