MITRAEthereumが気になっているフロントエンドエンジニアの渡邊ことタイショウです。みなさまいかがお過ごしでしょうか。タイトル通りpythonの記事です。pyjsとかではないです。最近フロントエンドエンジニアという肩書きが形骸化しはじめています。某エンジニアの方からは「フロントエンド=最前線では・・・」と言われてますが、多分鉄砲玉の意味合いだと思います。某案件にていままで使ったことのないpythonを採用しました。採用した理由は単純明快ではありますが、超大量のデータ+多次元配列での演算を実現する必要があったのでどう考えてもnumpyが最適解になりました。問題はあるもので、今回要求されているのは高速のレスポンスでして、そのまま素直に実装を行なっても要求される水準でのレスポンスは望めませんでした。試行錯誤の末、改善の効果を見込めた(python使い慣れている人なら知ってて当然思われる)6つのお約束事を実施しました。処理速度は素直に(何も考えずに)やった時の大体100分の1程度になりました。一部は@toritsuyo大先生の入れ知恵です。足を向けてねれません。Queue)5.messagepack6.sqlクエリの見直し以降の内容はpythonを実務でよく使われていらっしゃる方には見慣れたものだけなので、ここで読み終えていただくか、是非HAROiDへJOINいただきまして、まだ最適化されていない拙者のコードに対して罵詈雑言を与えていただければ幸いです。cythonnp.ndarrayを扱う部分やnumpy,scipyの演算部分がかなりボトルネックになっていたので、どうしたもんかなあと色々やっていたところ、cythonが早くなるよ!というのをちらほら見かけたのでノータイムで導入しました。cythonは型指定しないと最適化されないので、numpyをそのまま扱ってもあまりいい結果を得ることができませんでした。npでndarrayを型として認識してくれた結果、実行時間は25分の1まで短縮できました。リスト内包表記python慣れている方にとっては今更感満載だとは思いますが。val=="hoge"]の方が早いという話です。(なんで上の記法あるんでしょうね。c_items.extend(tmp_items)かなり多いデータ量のリストを扱って、ネストするループ処理に入れる場合は並列実行した方がはやい場合が往々にしてありえます(マシンスペックにもよりますが)。tmp_items]並列処理はtopで眺めてると実際たのしい。Queue)大先生による入れ知恵です。2.そのプロセス中に結果を返す必要がない部分(主にループで重い処理やってる場合)。要は非同期でオッケーな部分を切り離したい場合に非常に有効。joblibは2がFalseなケースなのでこの用途では使えないので使い分けます。rqを採用するメリットはworkerがメインプロセスと同一のサーバーにある必要がないので実行環境を切り離すことができるのが大きいかなと(同じ環境でももちろん可能)。Threadパターンだそうです。messagepack数M〜数十Mbyteのデータをほぼ連続的に別の実行環境に送り続けるような処理を行なっているので、できる限りデータサイズは抑えたいなあと思った際に検討していた中にありました。jsonで文字列で渡す場合と比較した場合に半分以下になった上に圧縮・解凍の処理性能もかなり良い結果だったので採用しました。何人かバージョンの互換性に苦しめられたとか聞いたのでその辺は注意が必要そうではありました。sqlクエリの見直しn+1とかやらかしていたのでほんと反省すべき。静的型付けでの実装を強いられるので、外部のモジュールを使用している場合などだと使用すること自体が難しいケースもあるかと思います。基本的には自分で実装している部分やnumpyで実装している部分で使うのがベターかなと思います。ループのネストがある場合なんかは、データ量が極端に少なくない限りはとりあえず試してみるといいのではないかなと。publicなapiを提供しなければならないケースだと忌避される可能性あるかと思いますが、裏側でガシガシやりたい場合や各実行環境のコントロールができる場合なんかは採用の余地はありかなーと。他のポイントはチリツモ案件だと思います。着手の段階からちゃんと気をつけましょう。これまでやってきた改善内容をせきららに披瀝いたしました。現在進行形で改善はやっている最中なのでこれええやんとかいうのがあればまた。約半年ぶりの投稿になります。(1)はてなブログをはじめよう!tt-techblogさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。