田中太郎
Pythonのリスト作成速度を改善しよう!
はじめに
Pythonはとても便利な関数ですが、その分C言語と比べて速度が劣ります。
研究や仕事でPythonのスクリプトを書いても、なかなか実行が終わらない経験があるのではないでしょうか?
そこで、今回はPythonの計算速度を向上する工夫を紹介します。
リストの作成を高速化
C言語から来た人はリストを作成するとき以下のように書きがちです。
a = []
for i in range(10):
a.append(i) # append でリストを追加
print(a)
"""実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
"""
しかし、Python には内包表記という書き方があります。
内包表記により、高速にリストを作成することができます。
a = [i for i in range(num)] # 内包表記
print(a)
"""実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
"""
では、実行速度を比べてみましょう。それぞれ1920*1080 個の配列を作成します。デコレータで実行速度を計測してます。詳細は以下をご覧ください。
def measure_time(func):
"""Measure process time."""
def _tmp(*args, **kwargs):
import time
start = time.time()
return_val = func(*args, **kwargs)
end = time.time() - start
print("PROCESS TIME: {} [s]".format(end))
return return_val
return _tmp
@measure_time
def func_1(num):
"""Main."""
a = []
for i in range(num):
a.append(i)
@measure_time
def func_2(num):
"""Main."""
a = [i for i in range(num)]
if __name__ == "__main__":
func_1(1920*1080)
func_2(1920*1080)
"""実行結果
PROCESS TIME: 0.10550546646118164 [s] # appendを使う
PROCESS TIME: 0.05993008613586426 [s] # 内包表記を使う
"""
約2倍、高速化しています。当然、作成するリストの大きさによりますが、こういう小さな積み重ねがのちのち効いてきます。
まとめ
今回は内包表記でリスト作成の速度を改善しました。
Python は便利な関数がたくさんありますが、使い方を間違えると実行速度が遅くなります。
工夫して楽しいコーディングライフを!
コメント