逆アセンブル用のモジュール
ソースコードも200行程度で読みやすそうなので、読んでみようかと。
その前にドキュメント読んだら面白かった。
Rubyで作る奇妙なプログラミング言語でスタックマシンを作ってみた経験が理解において非常に役に立った。
リスト内包標記
>>> def cp(l): return [e for e in l] ... >>> dis.dis(cp) 1 0 BUILD_LIST 0 3 DUP_TOP 4 STORE_FAST 1 (_[1]) 7 LOAD_FAST 0 (l) 10 GET_ITER >> 11 FOR_ITER 13 (to 27) 14 STORE_FAST 2 (e) 17 LOAD_FAST 1 (_[1]) 20 LOAD_FAST 2 (e) 23 LIST_APPEND 24 JUMP_ABSOLUTE 11 >> 27 DELETE_FAST 1 (_[1]) 30 RETURN_VALUE
ループで書いてみる
>>> def cp2(l): ... ll = [] ... for e in l: ... ll.append(e) ... return ll ... >>> dis.dis(cp2) 2 0 BUILD_LIST 0 3 STORE_FAST 1 (ll) 3 6 SETUP_LOOP 27 (to 36) 9 LOAD_FAST 0 (l) 12 GET_ITER >> 13 FOR_ITER 19 (to 35) 16 STORE_FAST 2 (e) 4 19 LOAD_FAST 1 (ll) 22 LOAD_ATTR 0 (append) 25 LOAD_FAST 2 (e) 28 CALL_FUNCTION 1 31 POP_TOP 32 JUMP_ABSOLUTE 13 >> 35 POP_BLOCK 5 >> 36 LOAD_FAST 1 (ll) 39 RETURN_VALUE
参考