Python 3 で数学を。

Python 3 とライブラリで数学の問題を解いていきます。統計学や機械学習はときどき。

自作 FizzBuzz 関数のバイトコードを逆アセンブルする。(Python 3: dis, dis())

使用するライブラリ

標準ライブラリの dis

Python 3 コード

fizz_buzz.py

#!/usr/bin/env python3


"""(docstring)
"""


def fizz_buzz():
    """
    >>> fizz_buzz()
    1
    2
    Fizz
    4
    Buzz
    Fizz
    7
    8
    Fizz
    Buzz
    11
    Fizz
    13
    14
    FizzBuzz
    """
    for n in range(1, 16):
        if n % 15 == 0:
            print('FizzBuzz')
        elif n % 3 == 0:
            print('Fizz')
        elif n % 5 == 0:
            print('Buzz')
        else:
            print(n)


if __name__ == '__main__':
    import doctest
    doctest.testmod()
    fizz_buzz()

出力 (対話モード)

>>> import dis
>>> from fizz_buzz import fizz_buzz
>>> dis.dis(fizz_buzz)
  27           0 SETUP_LOOP              92 (to 94)
              2 LOAD_GLOBAL              0 (range)
              4 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 (16)
              8 CALL_FUNCTION            2
             10 GET_ITER
        >>   12 FOR_ITER                78 (to 92)
             14 STORE_FAST               0 (n)

 28          16 LOAD_FAST                0 (n)
             18 LOAD_CONST               3 (15)
             20 BINARY_MODULO
             22 LOAD_CONST               4 (0)
             24 COMPARE_OP               2 (==)
             26 POP_JUMP_IF_FALSE       38

 29          28 LOAD_GLOBAL              1 (print)
             30 LOAD_CONST               5 ('FizzBuzz')
             32 CALL_FUNCTION            1
             34 POP_TOP
             36 JUMP_ABSOLUTE           12

 30     >>   38 LOAD_FAST                0 (n)
             40 LOAD_CONST               6 (3)
             42 BINARY_MODULO
             44 LOAD_CONST               4 (0)
             46 COMPARE_OP               2 (==)
             48 POP_JUMP_IF_FALSE       60

 31          50 LOAD_GLOBAL              1 (print)
             52 LOAD_CONST               7 ('Fizz')
             54 CALL_FUNCTION            1
             56 POP_TOP
             58 JUMP_ABSOLUTE           12

 32     >>   60 LOAD_FAST                0 (n)
             62 LOAD_CONST               8 (5)
             64 BINARY_MODULO
             66 LOAD_CONST               4 (0)
             68 COMPARE_OP               2 (==)
             70 POP_JUMP_IF_FALSE       82

 33          72 LOAD_GLOBAL              1 (print)
             74 LOAD_CONST               9 ('Buzz')
             76 CALL_FUNCTION            1
             78 POP_TOP
             80 JUMP_ABSOLUTE           12

 35     >>   82 LOAD_GLOBAL              1 (print)
             84 LOAD_FAST                0 (n)
             86 CALL_FUNCTION            1
             88 POP_TOP
             90 JUMP_ABSOLUTE           12
        >>   92 POP_BLOCK
        >>   94 LOAD_CONST              10 (None)
             96 RETURN_VALUE

読み方:

公式ドキュメントに詳しい。

参考文献

Fluent Python ―Pythonicな思考とコーディング手法

Fluent Python ―Pythonicな思考とコーディング手法