こんにちは、みっちゃんです。

プログラミングを学び始めた方であれば、どのような言語であっても、for文を書く経験があるのではないかと思います。

しかし、「for文は実行時間がかかる」と、よく言われます。本記事では、Pythonのset型変数を設定することで、実行時間を短くできることについて紹介したいと思います。

目次(まとめ)
- set型変数を設定して実行時間を短くできる

set型変数を設定して実行時間を短くできる

ここでは、以下のような簡単なPythonのスクリプトを用いて検証してみたいと思います。

### test_script_1.py ###

object = [1, 2, 3, 4, 5]
# print(type(object)) #=> <type 'list'>

query = [0, 3]

sum = 0
for i in query:
    if(i in object):
        sum = sum + i

# print(sum) #=> 3

このスクリプトの目的は、[1, 2, 3, 4, 5]の中からクエリとして設定した数字 (= 0 もしくは 3) を探して、もし一致すれば、その数字(= 3) を足していくことです。以下のように、実行して、実行時間を出します。

$ time python test_script.py

出力された実行時間(real: スクリプトの呼び出しから終了までにかかった実時間)は、0.047秒という結果でした。

上のスクリプトを修正して、1から10000までの自然数の中から、クエリとして設定した3の倍数(0を含む)を探して、もし一致すれば、その数字(3の倍数)を足していくスクリプトを、以下のように準備します(numを5にすると、上のスクリプトと同じになります)。

### test_script_2.py ###
num = 10000

object = range(num)
# print(type(object)) #=> <type 'list'>

query = range(0, num, 3)

sum = 0
for i in query:
    if(i in object):
        sum = sum + i

# print(sum) #=> 16668333

実行時間は、0.282秒となりました。

以上は、list型で設定したobjectを使用した場合の結果ですが、ここでlist型変数をset型に変換して実行してみたいと思います。

### test_script_3.py ###
num = 10000

object = set(range(num)) <----------------ここだけ修正
# print(type(object)) #=> <type 'set'>

query = range(0, num, 3)

sum = 0
for i in query:
    if(i in object):
        sum = sum + i

# print(sum) #=> 16668333

実行時間は、list型を用いた場合の約1/5の0.052秒となりました。

さらに、numを100000とすると、list型を用いた場合23.533秒かかるのに対し、set型に変換するだけで0.066秒になりました。

set型変数は検索されることを念頭に準備されたデータ型になっていて、list型よりも効率的に検索することが可能になります。つまり、今回のスクリプトでは、queryとしている変数を、set型のobjectから効率よく探しだすことができるので、objectのサイズが大きくなるほど、set型変数を用いる意義が増すということになります。

set型は実行時間を短くするために有用なデータ型なので、是非使ってみてください。