筋トレ大学生によるアウトプット雑記

筋トレや読書のことをはじめとして、プログラミングその他日常生活における様々なことについて書いていきます。

Pythonを高速化する5つの方法

スポンサーリンク

f:id:daimori1005:20191017110747p:plain

Pythonの処理を高速化したいですか?

大規模データを扱う場合、Pythonはうまく書かないと処理にかなり時間がかかります。

自分も実際、20万文以上の文章を扱って様々な処理を施していますが、高速化する方法を知らないときは、終了までに数時間や数日間にも及ぶプログラムを動かしていました。

しかし、高速化方法を実装してみたところ、数分で終わりました。

 
そこで本記事では、Pythonの処理が遅くて困っている方のために、僕が試したPython高速化の例を示します。

是非ご活用ください。



 

Pythonを高速化する5つの方法


さて、Pythonを高速化する方法を見ていきましょう。


f:id:daimori1005:20191017111403j:plain

リスト内包表記を使う

リストに対して、appendを使って値を入れていませんか?

リスト内包表記を使うだけで、圧倒的に処理が速くなります。


試しに 0 ~ 100,000,000の数字をリストに入れるプログラムを実行しました。

import time
 
val = range(0,100000000)
tmp = []
 
t1 = time.time()
for v in val:
    tmp.append(v)
t2 = time.time()
print(t2-t1)
 
t1 = time.time()
tmp = [x for x in val]
t2 = time.time()
print(t2-t1)

結果は以下のようになりました。

append 34.47秒
内包表記 17.45秒

 
かなり変わりますね。
大規模データを扱うときは、内包表記にしましょう。

appendせざるを得ない場合

appendせざるを得ない場合もあります。
そういう時は、appendをオブジェクト化しましょう。
上の例を使います。

my_append = tmp.append
for v in val:
   my_append(v)

のように書きます。

このオブジェクト化はあらゆる関数に適用できます。
速度が気になる方は、使っている関数をオブジェクト化すると良いかもしれません。

リストの静的確保

空リストを作ってappendするのは遅くなります。
あらかじめサイズが分かる場合は、静的確保を行いましょう。

x = [None] * n

予め確保する場合は、 [None] を個数分かけてやるのが一番早いです。
同じ要素を複数回リストに入れたい場合は、"*"を使うのが最も早いです。

Whileよりもforを使う

Whileは遅いです。
forを使いましょう。

参照回数をなるべく減らす

import time
 
val = [i for i in range(0,10000)]
 
tmp = []
sum = 0
 
t1 = time.time()
for v in val:
    sum += v
t2 = time.time()
print(t2-t1)
 
sum = 0
t1 = time.time()
for i in range(len(val)):
    sum += val[i]
t2 = time.time()
print(t2-t1)

こちらの例をご覧ください。
単純に足し算をするプログラムですが、下は毎回valを参照しています。

結果はこちら。

0.0024
0.0037

大規模データではもっと大きな差が開きます。

行列やベクトルはNumpyで

行列計算やベクトル計算はNumpyを使いましょう。
圧倒的に早くなります。

f:id:daimori1005:20191017123012j:plain

まとめ

いかがでしたか?

本記事では、Pythonの処理を高速化する5つの方法をまとめました。

自分はこれらの方法を実装して、数倍以上速くなりました。
大規模なデータを扱っている方は、こちら必見となります。


こちらの記事では、Pythonや機械学習について詳しく解説しています。
www.i-like-output.work

スポンサーリンク