Re: [問題]一個 遞迴的 return問題

作者: micangela (嘟)   2016-04-08 10:34:33
有趣的問題。 從Python bytecode來看有細微的差別。
以下是用Python2.7跑的實驗。
結果是第一個寫法多了一些東西,
但我猜很難對效能產生大影響。
===
實驗一
import dis
def f(i):
if i == 0: return
print(i)
f(i-1)
dis.dis(f)
實驗二
import dis
def f(i):
if i == 0: return
print(i)
return f(i-1)
dis.dis(f)
結果一
4 0 LOAD_FAST 0 (i)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 16
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
5 >> 16 LOAD_FAST 0 (i)
19 PRINT_ITEM
20 PRINT_NEWLINE
6 21 LOAD_GLOBAL 0 (f)
24 LOAD_FAST 0 (i)
27 LOAD_CONST 2 (1)
30 BINARY_SUBTRACT
31 CALL_FUNCTION 1
34 POP_TOP
35 LOAD_CONST 0 (None)
38 RETURN_VALUE
結果二
4 0 LOAD_FAST 0 (i)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 16
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
5 >> 16 LOAD_FAST 0 (i)
19 PRINT_ITEM
20 PRINT_NEWLINE
6 21 LOAD_GLOBAL 0 (f)
24 LOAD_FAST 0 (i)
27 LOAD_CONST 2 (1)
30 BINARY_SUBTRACT
31 CALL_FUNCTION 1
34 RETURN_VALUE
※ 引述《sunnoset (skj)》之銘言:
: f(10)
: 和
: def f(i):
: if i == 0: return
: print(i)
: return f(i-1)#加上return
: f(10)
: 執行結果一樣
: 10
: 9
: 8
: 7
: 6
: 5
: 4
: 3
: 2
: 1
: 但我好奇在背景是否有差別呢?
: 謝謝指教
作者: Yshuan (倚絃)   2016-04-08 10:55:00
因為沒return的情況 是當作return None誠實說 我不太理解為何要把這問題和遞迴併一起討論
作者: ENEP (Moo)   2016-04-09 01:20:00
推byte code 順便推這個 http://pythonfasterway.cf/

Links booklink

Contact Us: admin [ a t ] ucptt.com