Pythonを高速化するための いくつかのステップと Dask

43ba5a2227c580ce2290544d81c6261c?s=47 ksnt
November 27, 2019

Pythonを高速化するための いくつかのステップと Dask

43ba5a2227c580ce2290544d81c6261c?s=128

ksnt

November 27, 2019
Tweet

Transcript

  1. Pythonを高速化するため高速化するためのするための いくつかのステップとと Dask By ksnt @ksnt0215

  2. 先日の会話の会話 Python、いいですよね。いいですよね。 でも、いいですよね。速さが求められる場所求められる場所でめられる場所では全然使えなでは全然使えないん全然使えないんですよえないんですよね。。 (くやしい!)

  3. 注意(1) • 「Pythonを高速化するため高速化するためのする」というテーマはというテーマはとてつテーマはとてつもなくは全然使えないんとてつもなく広くて深いくて深いい 話 • もともと並列処理とか分散処理ととか分散処理とか分散処理ととかに詳しいというわ詳しいというわけしいというテーマはとてつわけでもない • よって、いいですよね。本発表は、狭くて浅いは全然使えないん、いいですよね。狭くて浅い話になくて浅い話にならざるい話に詳しいというわならざるを高速化するため得ないない • そうテーマはとてつすると、いいですよね。マはとてつもなくサカリが飛んできやすが求められる場所飛んできやすいとんできやすいとおもわれる

    • マはとてつもなくサカリが飛んできやす大歓迎!(ただし私は強くないぞ!は全然使えないん強くないぞ!くないぞ!)
  4. 注意(2) • 大事だけど話さないだけど話さないこと話さないこと: ボトルネックをプロを高速化するためプとロ ファイリが飛んできやすングすることすること • 並列処理とか分散処理とと分散処理とか分散処理とに詳しいというわ関しては重いのでしては全然使えないん重いので次回やいので次回やや る

  5. 高速化するためのの方法 • 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける • アルゴリが飛んできやすズムの改良の改良 • 並列処理とか分散処理と • 分散処理とか分散処理と •

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ • Dask (並列・分散処理とか分散処理と) 今日の会話のメインは全然使えないんここらへん! 次回や話すつもり速いです! 今日の会話は全然使えないんほとんど話さないこと話しません!
  6. 高速化するためのの方法 • 計算負荷の高い処理を避の高い処理を避け高い処理を避けるい処理を避ける処理を避けるを避ける避けるける • アルゴリが飛んできやすズムの改良の改良 • 並列処理とか分散処理と • 分散処理とか分散処理と •

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ • Dask (並列・分散処理とか分散処理と)
  7. よくある高速化するためのの話 - for文を避けるを高速化するため避けるける s = 0 for i in list_of_ints:

    s += i s = sum(list_of_ints) s = ‘’ for c in words: s = s + c 遅いい 速い s = ‘’.join(words) https://atsuoishimoto.hatenablog.com/entry/2019/01/18/180020 ※ ほぼ同等な処理時間同等な処理時間となな処理とか分散処理と時間となるように最となるようテーマはとてつに詳しいというわ最適化するための済
  8. • Pythonでプとログすることラムの改良を高速化するため書く時には、「パく時に詳しいというわは全然使えないん、いいですよね。「パフォーマはとてつもなくン スが求められる場所出る書き方」ではる書く時には、「パき方」というテーマはでは全然使えないんなく、いいですよね。「読みやすい書き方みやすい書く時には、「パき方」というテーマは を高速化するため心がけよう。が求められる場所けようテーマはとてつ。 • パフォーマはとてつもなくンス重いので次回や視で書いても、そで書く時には、「パいても、いいですよね。そんなに詳しいというわは全然使えないん速くは全然使えないん ならない。 • for 文を避けるを高速化するため使えないんですよったほうテーマはとてつが求められる場所読みやすい書き方みやすい、いいですよね。と思ったら、迷ったら、いいですよね。迷

    わずに詳しいというわ for 文を避けるを高速化するため使えないんですよえばよい。 https://atsuoishimoto.hatenablog.com/entry/2019/01/18/180020
  9. 高速化するためのの方法 • 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける • アルゴリズムの改良の高い処理を避け改良 • 並列処理とか分散処理と • 分散処理とか分散処理と •

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ • Dask (並列・分散処理とか分散処理と)
  10. メモ化 化するための - lru_cache 関しては重いので数をキャッシュを高速化するためキャッシュ(メモ化 化するための)してくれる! Dynamic Programming!    ※LRU =

    Least Recently Used 最近最も使えないんですよわれていないデー タを最初に捨てるを高速化するため最初に捨てる。に詳しいというわ捨てる。てる。
  11. 高速化するためのの方法 • 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける • アルゴリが飛んできやすズムの改良の改良 • 並列処理を避ける • 分散処理とか分散処理と •

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ • Dask (並列・分散処理とか分散処理と)
  12. 別の回にしましょの回やに詳しいというわしましょうテーマはとてつ

  13. 予告 • Pythonの並列化するためのモ化 ジュール └ multiprocessing, joblib • 並列処理とか分散処理とと分散処理とか分散処理と •

    プとロセスとスレッド
  14. 高速化するためのの方法 • 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける • アルゴリが飛んできやすズムの改良の改良 • 並列処理とか分散処理と • 分散処理を避ける •

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ • Dask (並列・分散処理とか分散処理と)
  15. これも別の回にしましょの回やに詳しいというわしましょうテーマはとてつ

  16. 予告 • Pythonで分散処理とか分散処理と └ PySpark, Dask • PySparkとは全然使えないん何かか • いつPySparkを高速化するため使えないんですようテーマはとてつのか?

    • PySparkの使えないんですよい方
  17. 高速化するためのの方法 • 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける • アルゴリが飛んできやすズムの改良の改良 • 並列処理とか分散処理と • 分散処理とか分散処理と •

    Pythonより速い速いい処理を避けるPythonを避ける使うう • Dask (並列・分散処理とか分散処理と)
  18. Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ • Numba • Cython • SWIG • PyPy

  19. Numba

  20. Numba • PythonおよびNumPyのサブセットのソース コードを高速化するため高速に詳しいというわ実行する機械語に変する機械語に変換するに詳しいというわ変換するするJIT コンパイラ

  21. JIT(Just-In-Time)コンパイラ • ソフトウェアを高速化するため構成するモジュールするモ化 ジュールやクをプロラス、いいですよね。関しては重いので数をキャッシュなど話さないことの、いいですよね。ある単位のの コードが求められる場所まさに詳しいというわ実行する機械語に変されるその時に詳しいというわ、いいですよね。コンパイルされる • JITを高速化するため装備した処理系は、した処理とか分散処理と系は、表面上はイは全然使えないん、いいですよね。表は、狭くて浅い面上はインタプリタは全然使えないんインタを最初に捨てるプとリが飛んできやすタを最初に捨てるとして動作するが、内部でするが求められる場所、いいですよね。内部でで コンパイルを高速化するため行する機械語に変い、いいですよね。メモ化 リが飛んできやす上はインタプリタに詳しいというわ生成するモジュールした機械語に変換するのコードが求められる場所実行する機械語に変されるた め、いいですよね。インタを最初に捨てるプとリが飛んできやすタを最初に捨てると比べると実行速度べると実行する機械語に変速度を向上することを高速化するため向上はインタプリタすることが求められる場所できる

    • この意味で、で、いいですよね。JITは全然使えないんCPUやOSに詳しいというわ依存しない実行形式しない実行する機械語に変形式を配布できる、を高速化するため配布できる、というできる、いいですよね。というテーマはとてつ インタを最初に捨てるプとリが飛んできやすタを最初に捨てるの利点を保ったまま、を高速化するため保ったまま、実行ったまま、いいですよね。実行する機械語に変速度を向上することが求められる場所遅いい、いいですよね。というテーマはとてつ欠点を保ったまま、を高速化するため克服しし ようテーマはとてつとするものといえる。
  22. Numbaのインストール $pip install numba

  23. Numbaの使えないんですよい方 from numba import jit @jit def function(): ….

  24. 何かも考えず使ってみるえず使えないんですよってみる

  25. None
  26. 結果 Time in not jit implementation is: 4.982959985733032 Time in

    jit implementation is: 5.255100727081299
  27. 反省 • numpyに詳しいというわ対してなら速くなしてなら速くなるというテーマはとてつ記事だけど話さないが求められる場所あったり速いする • https://qiita.com/toyolab/items/b5d95bd38b3c7c66b510 • いい加減な気持ちでな気持ちでちでNumba/JITを高速化するため使えないんですよっても高速化するためのできる わけでは全然使えないんないらしい • JITの話は全然使えないんまた別の回にしましょの機会に詳しいというわ深いくやり速いましょうテーマはとてつ

  28. Cython

  29. Cython • C言語に変換するに詳しいというわよるPythonの拡張モジュールの作モ化 ジュールの作するが、内部で成するモジュールの労力を軽減を高速化するため軽減な気持ちで することを高速化するため目的として開発されとして開発されたプとログすることラミングすること言語に変換する • 言語に変換する仕様はほとんどは全然使えないんほとんど話さないことPythonのものと同じ (上はインタプリタ位の互換する) だ が求められる場所、いいですよね。Cの関しては重いので数をキャッシュを高速化するため直接呼び出したり、び出る書き方」ではしたり速い、いいですよね。C言語に変換するの変数をキャッシュの型やクやクをプロ

    ラスを高速化するため宣言できるなど話さないことの拡張モジュールの作が求められる場所行する機械語に変われている • SAGEで使えないんですよわれている
  30. Cythonで改善するコードするコード • ループと処理とか分散処理と • 演算処理とか分散処理と • 関しては重いので数をキャッシュ呼び出したり、び出る書き方」ではし

  31. Cythonのインストール (Ubuntu18.04) $ apt install Cython $ cython --version Cython

    version 0.29.6
  32. distutils で Cython モ化 ジュールを高速化するためビルドする • hello.pyxを高速化するため用意 • setup.pyを高速化するため用意 •

    $python setup.py build_ext --inplace でモ化 ジュールを高速化するためビルド • Pythonのインタを最初に捨てるプとリが飛んできやすタを最初に捨てるからfrom hello import say_hello_to を高速化するため実行する機械語に変し、いいですよね。 import した関しては重いので数をキャッシュを高速化するため使えないんですようテーマはとてつ
  33. hello.pyx setup.py

  34. SWIG

  35. SWIG • C/C++ で書く時には、「パかれたプとログすることラムの改良やライブラリが飛んできやすを高速化するためスクをプロリが飛んできやすプとト言語に変換するや プとログすることラミングすること言語に変換するに詳しいというわ接続するためのオーするためのオープとンソースのツール • ヘッダファイルに詳しいというわわずかな数をキャッシュの特殊なコマンドを記なコマはとてつもなくンドを高速化するため記述すると、すると、いいですよね。 SWIGは全然使えないんC/C++と対してなら速くな象の言語とを橋渡の言語に変換するとを高速化するため橋渡しするグルーコしするグすることルーコードを高速化するため生 成するモジュールする •

    PythonからCの関しては重いので数をキャッシュを高速化するため呼び出したり、べるようテーマはとてつに詳しいというわなる
  36. インストール (Ubuntu18.04) • 公式を配布できる、サイトからバイナリが飛んできやすファイルを高速化するためダウンロード • 圧縮ファイルを展開ファイルを高速化するため展開 • $ ./configure •

    $ make • $ sudo make install
  37. http://rinatz.github.io/swigdoc/tutorial.html

  38. http://rinatz.github.io/swigdoc/tutorial.html ここまでできたら、いいですよね。PythonからHello()が求められる場所呼び出したり、び出る書き方」ではせるようテーマはとてつに詳しいというわなっている。

  39. PyPy

  40. PyPy • Pythonで記述すると、されたPythonの処理とか分散処理と系は、表面上はイ • RPython (Restricted Python) で記述すると、されている • Cythonより速い速い

    これを高速化するためそのまま(?)使えないんですようテーマはとてつとさらに詳しいというわ速いらしい
  41. PyPyの特徴 • 少なくとも数秒のなくとも数をキャッシュ秒の間実行されなの間となるように最実行する機械語に変されなければJITコン パイラが求められる場所ウォームの改良アップとのための十分な時間となるように最を高速化するため とれない • 実行する機械語に変に詳しいというわ長時間となるように最かかるときに詳しいというわうテーマはとてつまく働いてくれるいてくれる

  42. PyPyのインストール(Ubuntu 18.04) $sudo apt install pypy $ pypy -V Python

    2.7.13 (5.10.0+dfsg-3build2, Feb 06 2018, 18:37:50) [PyPy 5.10.0 with GCC 7.3.0] $ sudo snap install pypy3 --classic $ pypy3 -V Python 3.6.9 (5da45ced70e5, Oct 09 2019, 19:12:54) [PyPy 7.2.0 with GCC 6.2.0 20160901]
  43. 速度を向上することの比べると実行速度較 $ python3 compare_time.py end:8.666760921478271 $ pypy3 compare_time.py end:0.12522006034851074 import

    time start = time.time() for i in range(100000000): i * i end = time.time() - start print("end:{0}".format(end))
  44. 高速化するためのの方法 • 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける • アルゴリが飛んできやすズムの改良の改良 • 並列処理とか分散処理と • 分散処理とか分散処理と •

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ • Dask (並列・分散処理を避ける)
  45. Dask

  46. Dask • Pythonで並列処理とか分散処理と・分散処理とか分散処理となど話さないことを高速化するため簡単に詳しいというわ扱ってくれってくれ る • データを最初に捨てるを高速化するため全てメモ化 リが飛んできやすに詳しいというわ乗せず、部分的なせず、いいですよね。部で分的として開発されなかたまり速い単位の でメモ化 リが飛んできやすに詳しいというわ乗せず、部分的なせたり速いして計算するので、いいですよね。通常はは全然使えないん Pandasなど話さないことでメモ化

    リが飛んできやすに詳しいというわ乗せず、部分的なり速い切らない大きなデらない大きなデータを最初に捨てる セットでも扱ってくれえる https://qiita.com/simonritchie/items/e174f243bc03fb25462e
  47. データを最初に捨てるの大きさ Data Science with Python and Dask

  48. Daskの特徴 1. 動的として開発されタを最初に捨てるスクをプロスケジューリが飛んできやすングすること Airflow, Luigi, Celery, Makeと似ているが ているが求められる場所 interactive computational

    workloadsのために詳しいというわ最適化するためのされている点を保ったまま、が求められる場所違ううテーマはとてつ 2. “Big Data”コレクをプロションズ parallel arrays, dataframes, and lists that extend common interfaces like NumPy, Pandas, or Python iterators to larger- than-memory or distributed environments
  49. None
  50. None
  51. None
  52. 他にもに詳しいというわも... • vaex • Koalas

  53. まとめ • 高速化するためのの方法は全然使えないんたくさんある • しかし、いいですよね。その高速化するためのが求められる場所本当に効果的なのかに詳しいというわ効果的として開発されなのかよく 考えず使ってみるえる必要があるが求められる場所ある

  54. 参考えず使ってみる文を避ける献 • Pythonの高速化するための? - atsuoishimoto's diary • Python 3.8 の概要がある

    (その4) - multiprocessing.shared_memory モ化 ジュール - atsuoishimoto's diary • 高速化するためののためのPython Tips – のんびり速いしているエンジニアの日の会話記 • High Performance Python • Expert Python Programming Second Edition • Learning Cython Programming • http://rinatz.github.io/swigdoc/tutorial.html • 深い入りしないり速いしないCython入りしない門
  55. 参考えず使ってみる文を避ける献 (Dask) • PythonのDaskを高速化するためしっかり速い調べてみた(大きべてみた(大きなデータを最初に捨てるセットを高速化するため 快適に詳しいというわ扱ってくれうテーマはとてつ) • 時間となるように最のかかる前処理とか分散処理とを高速化するためDaskで高速化するための - ぴよぴよ.py •

    Data Science with Python and Dask • DASK: Pythonでの並列処理とか分散処理と - Python Kansai #01 • Python Dask で 並列 DataFrame 処理とか分散処理と - StatsFragments
  56. より速い発展的として開発されな内容 • Matthew Page - How to JIT: Writing a

    Python JIT from scratch in pure Python - PyCon 2019