12345678_0001
在指数检查中执行此操作将放慢某些情况,因为它不是非常简单的2的幂,因此不一定是胜利。但是,在预先知道指数的情况下(例如使用文字2),可以通过简单的窥孔优化来优化生成的字节码。大概这根本不值得做(这是一个相当具体的情况)。这是进行这种优化的概念的快速证明(可用作装饰器)。注意:您将需要字节播放模块来运行它。import byteplay, timeitdef optimise(func): c = byteplay.Code.from_code(func.func_code) prev=None for i, (op, arg) in enumerate(c.code): if op == byteplay.BINARY_POWER: if c.code[i-1] == (byteplay.LOAD_CONST, 2): c.code[i-1] = (byteplay.DUP_TOP, None) c.code[i] = (byteplay.BINARY_MULTIPLY, None) func.func_code = c.to_code() return funcdef square(x): return x**2print "Unoptimised :", timeit.Timer('square(10)','from __main__ import square').timeit(10000000)square = optimise(square)print "Optimised :", timeit.Timer('square(10)','from __main__ import square').timeit(10000000)给出时间:Unoptimised : 6.42024898529Optimised : 4.52667593956[编辑] 实际上,再考虑一下,有一个很好的理由说明未完成此优化。不能保证有人不会创建用户定义的类来覆盖__mul__and __pow__方法,并为每个方法做不同的事情。安全地执行此操作的唯一方法是,如果可以保证堆栈顶部的对象是具有相同结果“ x **2”和“ x*x”的对象,但是解决该问题要困难得多。例如。在我的示例中,这是不可能的,因为任何对象都可以传递给Square函数。