对我来说,它们的速度几乎相同:(Debian上的Python 2.6.6)
In [4]: %timeit fact1(1)10000000 loops, best of 3: 151 ns per loopIn [5]: %timeit fact2(1)10000000 loops, best of 3: 154 ns per loop
字节码也非常相似:
In [6]: dis.dis(fact1) 20 LOAD_FAST 0 (n) 3 LOAD_ConST 1 (2) 6 COMPARE_OP 0 (<) 9 JUMP_IF_FALSE 5 (to 17) 12 POP_TOP 3 13 LOAD_ConST 2 (1) 16 RETURN_VALUE >> 17 POP_TOP 5 18 LOAD_FAST 0 (n) 21 LOAD_GLOBAL 0 (fact) 24 LOAD_FAST 0 (n) 27 LOAD_ConST 2 (1) 30 BINARY_SUBTRACT 31 CALL_FUNCTION 1 34 BINARY_MULTIPLY 35 RETURN_VALUE 36 LOAD_ConST 0 (None) 39 RETURN_VALUE In [7]: dis.dis(fact2) 20 LOAD_FAST 0 (n) 3 LOAD_ConST 1 (2) 6 COMPARE_OP 0 (<) 9 JUMP_IF_FALSE 5 (to 17) 12 POP_TOP 3 13 LOAD_ConST 2 (1) 16 RETURN_VALUE >> 17 POP_TOP 4 18 LOAD_FAST 0 (n) 21 LOAD_GLOBAL 0 (fact) 24 LOAD_FAST 0 (n) 27 LOAD_ConST 2 (1) 30 BINARY_SUBTRACT 31 CALL_FUNCTION 1 34 BINARY_MULTIPLY 35 RETURN_VALUE
唯一的区别是,如果控制到达函数主体的末尾,则else返回包含代码的版本None。



