分析処理の高速化について
背景
データ分析においては、PythonとRがよく使われます。
PythonにはPandasやnumpy、scikit-learnなどの強力なライブラリ、Jupyter Notebookというインタラクティブ環境もあるため、データ分析向け言語として非常に有力です。 Pythonはデータ分析以外にもアプリケーションを作ることもでき、非常に汎用性が高いです。一方、動的型付けの言語であるため処理速度面では遅い部類に入ります。データ分析では大量のデータを処理したり、いろんなパラメタやら手法でトライアンドエラーすることがあります。ということで、重い処理をどうにか高速に処理する方法を色々探っていきたいなーというのが本記事のモチベーションになります。できたらシリーズ化したいです。
高速化の方法
思いつくものを挙げるとこんなところでしょうか。
- 処理の並列化
- pypy使う
- cython使う
- コンパイル言語使う
- GPGPU使う
- マシンスペックを上げる(クラウドに課金する)
コンパイル言語を使う」は処理を部分的に他の言語でやる、Python API叩くというやり方があります。別に排他ではないのですが、それぞれの長所/短所をまとめます。
方法 | 長所 | 短所 |
---|---|---|
並列化 | お手軽。scikit-learnで学習するときはn_jobs=10などで簡単にできるものもある。 | 必ずしも並列化できるかはわからない |
pypy | ほぼそのままのpythonコードが動かせる。 | 時折使えないライブラリがある |
cython | Pythonicである | 特になし |
コンパイル言語 | 処理速度の桁が違う |
|
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系で結構違いそうなので、その辺りも見てみたいです。
DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。
Contact
Explore Jobs
関連記事