Pythonの処理が遅いと感じたことはありませんか?
私は常々思っています!
開発の仕様でどうしてもループやpandasで大きいDataFrameを使う際には、速度の問題は避けて通れない問題です。機械学習では大量のデータを使いますから尚更です。
Pythonも日々新しいライブラリが出ておりますし、高速計算ができるようなライブラリに変更をする。またはC++やRustのような言語を使ってPythonの処理を高速化させるという手段もあるでしょう。
しかし、高速化をするからといって安易に取り入れるべきではない手段があります。
特に会社などでのチーム開発ではあまりお勧めできない手段があります。
そこで、Pythonの処理が遅いとき、どのように考えて処理するべきなのかの私見を述べていきたいと思います。
*実務での話を想定しています
基本的には最初にアルゴリズム・データの見直し
最初にやることも最も時間を割くべきところも「現行処理の見直し」です。つまり、アルゴリズムやデータの効率が悪くなっているところを見直すということです。 始めから「じゃあライブラリを変えてみよう!」みたいな動きは良くないです。工数もかかりますし、修正する前後の処理も見直す可能性が高いです。特にループ処理を入れたりすると確実に時間を取られることになります。
やるべき工夫としては、
- ループ自体を減らす
- ループ内での処理を簡略化する
- ループで処理をするデータの持ち方・量を変える
などがあります。
本当にループでなければ処理できないかを考えたり、中間のデータの処理を効率化できないかを最初に考えるべきです。次からの手段は基本的なアルゴリズムやデータの見直し後に考えることをおすすめします。
同じ処理なのに書き方を変えると早くなることは多々あるので、まずは同じ処理の違う書き方を色々試してみることです。
ライブラリの変更
上記の方法でもどうしても簡略化できない処理があったり、精度を技勢にできずにデータ量を減らせないときは処理するライブラリの変更も検討しなければならないかもしれません。 例えば、Pandasなどを使えばテーブルデータの処理は非常に楽になりますが、処理はどうしても遅くなります。代わりに
- numpyだけで処理できるようにする
- pandasの代わりにpolarsを使用する
- PySpark、Cpythonなどを使う
などのライブラリの使用を検討することもできます。
PolarsはPandasと書き方も似ている上に高速で処理ができますし、テーブルデータを処理するならばPysparkを使用してもいいかもしれません。また、そもそもpandasを使わずに処理できるならnumpyで処理できるようにアルゴリズムを変えることもできるかもしれません。
ボトルネックになっているものがライブラリならば、代替を使うという方法です。
ただし、この方法は場合によっては相当の工数がかかる場合があります。
また、機械学習モデルではデータの処理をするライブラリを変えたことで精度に影響する可能性もあります。
C++、 Rustを使う
それでも狙っている速度を出すことができない場合はPython使うこと自体も考えなければならないかもしれません。
特に画像分野のような計算量が膨大になる分野では、C++を使って処理を高速化することも考えられます。
C++は一般的にPythonよりも処理が早く、またPythonと組み合わせて使う手法はドキュメントも少なからずあるので実装すること自体は可能です。
しかし、この方法はチーム開発においてはあまりお勧めできない方法です。
それは保守・運用のコストが上がってしまうからです。
チームの全員がC++の記法に通じていれば問題ないかもしれませんが、将来的にずっとそうである保証はありません。
一般的にC++は習得難易度が高い言語としても知られているので、自分以外に習得を促すことになりますがそれはメンバーに負担をかけることになってしまいます。
この手法は、特に新規開発でもない場合は最終手段であることは間違い無いでしょう。