【Python】【timeit】コードの処理の実行時間を計測する!


 僕は何度か、Pythonの標準機能として既に存在しているプログラムを自分で作りました。自分でアルゴリズムを考えて手を動かす学習のためです。

 そんな時に考えたのは、「同じプログラムは同じプログラムでも、処理にかかる時間はそれぞれどのように異なるのだろう」ということでした。

 そこで、「timeit」というモジュールを使って、同じプログラムの処理にかかる時間を比較してみることにしました。
 今回は以下の、16進数を10進数に変えるプログラムを用いました。参考までに、コメントでいただいた他のプログラムも使わせていただきました。

import timeit

def change_decimal(hexa): #【A】
    nums = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,
            '7':7,'8':8,'9':9,'A':10,'B':11,
            'C':12,'D':13,'E':14,'F':15}
    sum = 0
    for i in hexa:
        sum = 16 * sum + nums[i.upper()]
    return sum


HEXA = '0123456789ABCDEF'
def change_decimal2(hexa): #【B】
    return sum(HEXA.index(digit.upper()) * (16**n)
               for n, digit in enumerate(hexa[::-1]))

try:
    hexa = input("16進数を入力してください(マイナス値が扱えません):")

    result = change_decimal(hexa)
    print("【A】:",result)
    print("処理にかかる時間は",timeit.timeit('change_decimal(hexa)',globals=globals()),"です")

    print()

    result2 = change_decimal2(hexa)
    print("【B】:",result2)
    print("処理にかかる時間は",timeit.timeit('change_decimal2(hexa)',globals=globals()),"です")

    print()

except KeyError:
    print('0~9の数字、A~Fの英字を半角で入力してください')


print("Python標準機能:",int(hexa, 16))
print("処理にかかる時間は",timeit.timeit('int(hexa, 16)',globals=globals()),"です")


 そうすると出力結果は以下のようになりました。予想できることではありますが、標準機能を使った場合が圧倒的に速いですね。

16進数を入力してください(マイナス値が扱えません):ff5
【A】: 4085
処理にかかる時間は 1.15236393 です

【B】: 4085
処理にかかる時間は 2.2030069250000004 です

Python標準機能: 4085
処理にかかる時間は 0.14431074899999974 です

 大規模のプログラムを作るとなると、ロジックやコード量だけでなく、処理速度も考慮に入れなければならないと考えられます。この「timeit」というモジュールの存在を知った時に、プログラミングって奥が深くて面白いなーって思いました。