こんにちは、みっちゃんです。
プログラミングを学び始めた方であれば、どのような言語であっても、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型は実行時間を短くするために有用なデータ型なので、是非使ってみてください。