医療職からデータサイエンティストへ医療職からデータサイエンティストへ統計学、機械学習に関する記事をまとめています。Pythonが遅いと感じたら!見直すべき高速化のポイント2020-06-21Pythonが遅いと感じたら!見直すべき高速化のポイントPythonPythonはrに比べると処理速度が速いと言われています。Julia、C/C++などに比べると”うわ、私の処理、遅すぎ、、?”と感じるかもしれません。今回は、Pyhonで処理速度が遅いと感じたら見直すべきいくつかのポイントをご紹介します。listはsetに変えるべしPoint2:辞書の作成はdefaultdictを使うべしPoint3:ローカル変数を使うべしPoint4:関数アクセスでdot.は避けるべしPoint5:変数置換は1行で済ませるべしPoint6:文字列の結合はjoinを使うべしPoint7:for文innerloopはできるだけ外側で済ますべしまとめ参考なお、本内容はこちらの記事を筆者が引用、改変したものです。listを使うことがあります。その際にsetを使うと処理が高速になります。mslistの場合2秒程度かかっていた処理が、setに変えただけで20msに短縮されました!もちろん、判断している配列の長さは同じです。print(len(list_seq))print(len(set_seq))>1000>1000Point2:辞書の作成はdefaultdictを使うべしPythonの辞書形は存在しないkeyを指定するとエラーになります。'rabbit'そのためfor文などで、繰り返し辞書を作成する際には、はじめにそのkeyが辞書に存在するかを判断させる必要があります。colloctionモジュールのdefaultdictは、デフォルト値を設定できるため、keyの存在を確認する必要がなく、処理速度が速くなります。s若干ですが速くなっています。defaultdictは他にも様々な使い方ができるので、気になる方は下部参考をご覧ください。Point3:ローカル変数を使うべしPythonでは、同じ処理でもグローバル変数を使うより、関数内のローカル変数を使った方が処理が速くなります。s同じ処理を関数にしただけで、高速になりましたね!Point4:関数アクセスでdot.は避けるべしimportで読み込んだモジュールから関数を使う場合、.で繋げてアクセスします。importした方が速度は速くなります。先ほどの例で使ったsqrtを直接読み込んで使ってみます。sさらにlistのappnedも変数に代入してしまいます。s.がfor文内にある場合は、上記を考慮すると速くなるかもしれません。Point5:変数置換は1行で済ませるべしPythonは、複数の値を複数の変数に1行で代入することができます。これを用いると変数の入れ替えなどは、高速になります。sこの記法はPython独特ですが、積極的に使っていきたいですね。Point6:文字列の結合はjoinを使うべしpythonの文字列結合には、様々な方法がありますが、文字列が配列になっている場合は、joinを使うと高速になります。msjoinは配列で処理をするため、高速になりました。Point7:for文innerloopはできるだけ外側で済ますべしfor文内にfor文を書くinnerloopの場合は、innerloopの外で処理ができる場合外側で処理を済ませましょう。sinnerloopの場合、何度も同じ計算を避けるように工夫することで速くなります。まとめ大規模データになると解析前の処理を行うだけで、多くの時間がかかる場合があります。できるだけ助長な記述を減らし、最短ルートで同じ結果を得られるように工夫したいですね。※本記事は筆者が個人的に学んだこと感じたことをまとめた記事なります。所属する組織の意見・見解とは無関係です。学んだこと、日々の所感をまとめていきます。※本ブログは筆者が個人的に学んだこと感じたことをまとめたブログになります。所属する組織の意見・見解とは無関係です。medi_data0826引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。