楽屋

分析処理の高速化について

背景

データ分析においては、PythonとRがよく使われます。弊社においてもこんな絵を作っています。
会社概要ページからの引用
PythonにはPandasやnumpy、scikit-learnなどの強力なライブラリ、Jupyter Notebookというインタラクティブ環境もあるため、データ分析向け言語として非常に有力です。 Pythonはデータ分析以外にもアプリケーションを作ることもでき、非常に汎用性が高いです。一方、動的型付けの言語であるため処理速度面では遅い部類に入ります。データ分析では大量のデータを処理したり、いろんなパラメタやら手法でトライアンドエラーすることがあります。ということで、重い処理をどうにか高速に処理する方法を色々探っていきたいなーというのが本記事のモチベーションになります。できたらシリーズ化したいです。

高速化の方法

思いつくものを挙げるとこんなところでしょうか。
  1. 処理の並列化
  2. pypy使う
  3. cython使う
  4. コンパイル言語使う
  5. GPGPU使う
  6. マシンスペックを上げる(クラウドに課金する)
コンパイル言語を使う」は処理を部分的に他の言語でやる、Python API叩くというやり方があります。別に排他ではないのですが、それぞれの長所/短所をまとめます。
方法長所短所
並列化お手軽。scikit-learnで学習するときはn_jobs=10などで簡単にできるものもある。必ずしも並列化できるかはわからない
pypyほぼそのままのpythonコードが動かせる。時折使えないライブラリがある
cythonPythonicである特になし
コンパイル言語処理速度の桁が違う
  • 学習コストが高い
GPGPU処理速度の桁が違う実行環境が限られる
マシンスペックを上げる簡単にできるクライアントによっては制限される
コンパイル言語とGPGPUについてはコーダーの腕に強く依存します。困ったら上から試してみるのがよいと思っています。Pandasやmatplotlib使いたいのでできればcythonくらいまででなんとかしたいです。 今後は、pypy、cython、コンパイル言語の3つで、①処理速度、②実装コストの面で比較をしていこうと思います。軽い処理ではありがたみがないので、数日間放置プレイしたような重い処理がターゲットです。

言語選択

次に、どのプログラミング言語で実装を行うか、ということを考えます。有名どころのコンパイル言語で高速なものというと、以下のものがあります。
  • C/C++
    • 超早い
    • 変なメモリアクセスとかできてしまう
    • ライブラリが豊富
    • とても奥が深い
  • Java
    • C/C++には負けるがPythonよりだいぶ早い
    • メモリ管理が楽
    • ライブラリが豊富
  • C#
    • 基本はWindows(と思っている人が多い)
  • D
    • C++とJavaのいいとこどり狙っている?
    • そこそこ歴史あるけどいまいちパッとしない
  • Scala
    • Java VM上で動く
    • 関数型
  • Rust
    • この中では最も新しく、モダンな機能てんこ盛り
僕は前職SIer(6年)ですが、上の中で経験あるのはC++、Javaくらいです。Cは研修で、Dは趣味でやったことがあるくらいです。これらの中で、データサイエンティストが身につけて最もメリットありそうなのは残念ながらC++かと。残念ですが。 Scalaな案件もたま〜にあるでしょうか。僕のキャパ的にどれも手をつけることはできないので、C++にしておきます。転職するときC++にバイバイできると喜んだのも束の間です。環境はLinux+GCCにします。

次回予告

最近やった自然言語処理について、実装交えてやっていこうと思います。C++で正規表現書いたことなかったんですが、C++11でようやく入ってたんですね。文字列操作となるとpythonでも2系と3系で結構違いそうなので、その辺りも見てみたいです。