$30 off During Our Annual Pro Sale. View Details »

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

ksnt
November 27, 2019

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

ksnt

November 27, 2019
Tweet

More Decks by ksnt

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. 注意(1)
    ● 「Pythonを高速化するため高速化するためのする」というテーマはというテーマはとてつテーマはとてつもなくは全然使えないんとてつもなく広くて深いくて深いい

    ● もともと並列処理とか分散処理ととか分散処理とか分散処理ととかに詳しいというわ詳しいというわけしいというテーマはとてつわけでもない
    ● よって、いいですよね。本発表は、狭くて浅いは全然使えないん、いいですよね。狭くて浅い話になくて浅い話にならざるい話に詳しいというわならざるを高速化するため得ないない
    ● そうテーマはとてつすると、いいですよね。マはとてつもなくサカリが飛んできやすが求められる場所飛んできやすいとんできやすいとおもわれる
    ● マはとてつもなくサカリが飛んできやす大歓迎!(ただし私は強くないぞ!は全然使えないん強くないぞ!くないぞ!)

    View Slide

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

    View Slide

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

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ

    Dask (並列・分散処理とか分散処理と)
    今日の会話のメインは全然使えないんここらへん!
    次回や話すつもり速いです!
    今日の会話は全然使えないんほとんど話さないこと話しません!

    View Slide

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

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ

    Dask (並列・分散処理とか分散処理と)

    View Slide

  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
    ※ ほぼ同等な処理時間同等な処理時間となな処理とか分散処理と時間となるように最となるようテーマはとてつに詳しいというわ最適化するための済

    View Slide


  8. Pythonでプとログすることラムの改良を高速化するため書く時には、「パく時に詳しいというわは全然使えないん、いいですよね。「パフォーマはとてつもなくン
    スが求められる場所出る書き方」ではる書く時には、「パき方」というテーマはでは全然使えないんなく、いいですよね。「読みやすい書き方みやすい書く時には、「パき方」というテーマは
    を高速化するため心がけよう。が求められる場所けようテーマはとてつ。
    ● パフォーマはとてつもなくンス重いので次回や視で書いても、そで書く時には、「パいても、いいですよね。そんなに詳しいというわは全然使えないん速くは全然使えないん
    ならない。

    for 文を避けるを高速化するため使えないんですよったほうテーマはとてつが求められる場所読みやすい書き方みやすい、いいですよね。と思ったら、迷ったら、いいですよね。迷
    わずに詳しいというわ for 文を避けるを高速化するため使えないんですよえばよい。
    https://atsuoishimoto.hatenablog.com/entry/2019/01/18/180020

    View Slide

  9. 高速化するためのの方法
    ● 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける
    ● アルゴリズムの改良の高い処理を避け改良
    ● 並列処理とか分散処理と
    ● 分散処理とか分散処理と

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ

    Dask (並列・分散処理とか分散処理と)

    View Slide

  10. メモ化 化するための - lru_cache
    関しては重いので数をキャッシュを高速化するためキャッシュ(メモ化 化するための)してくれる!
    Dynamic Programming!   
    ※LRU = Least Recently Used
    最近最も使えないんですよわれていないデー
    タを最初に捨てるを高速化するため最初に捨てる。に詳しいというわ捨てる。てる。

    View Slide

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

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ

    Dask (並列・分散処理とか分散処理と)

    View Slide

  12. 別の回にしましょの回やに詳しいというわしましょうテーマはとてつ

    View Slide

  13. 予告

    Pythonの並列化するためのモ化 ジュール
    └ multiprocessing, joblib
    ● 並列処理とか分散処理とと分散処理とか分散処理と
    ● プとロセスとスレッド

    View Slide

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

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ

    Dask (並列・分散処理とか分散処理と)

    View Slide

  15. これも別の回にしましょの回やに詳しいというわしましょうテーマはとてつ

    View Slide

  16. 予告

    Pythonで分散処理とか分散処理と
    └ PySpark, Dask

    PySparkとは全然使えないん何かか
    ● いつPySparkを高速化するため使えないんですようテーマはとてつのか?

    PySparkの使えないんですよい方

    View Slide

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

    Pythonより速い速いい処理を避けるPythonを避ける使うう

    Dask (並列・分散処理とか分散処理と)

    View Slide

  18. Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ

    Numba

    Cython

    SWIG

    PyPy

    View Slide

  19. Numba

    View Slide

  20. Numba

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

    View Slide

  21. JIT(Just-In-Time)コンパイラ
    ● ソフトウェアを高速化するため構成するモジュールするモ化 ジュールやクをプロラス、いいですよね。関しては重いので数をキャッシュなど話さないことの、いいですよね。ある単位のの
    コードが求められる場所まさに詳しいというわ実行する機械語に変されるその時に詳しいというわ、いいですよね。コンパイルされる

    JITを高速化するため装備した処理系は、した処理とか分散処理と系は、表面上はイは全然使えないん、いいですよね。表は、狭くて浅い面上はインタプリタは全然使えないんインタを最初に捨てるプとリが飛んできやすタを最初に捨てるとして動作するが、内部でするが求められる場所、いいですよね。内部でで
    コンパイルを高速化するため行する機械語に変い、いいですよね。メモ化 リが飛んできやす上はインタプリタに詳しいというわ生成するモジュールした機械語に変換するのコードが求められる場所実行する機械語に変されるた
    め、いいですよね。インタを最初に捨てるプとリが飛んできやすタを最初に捨てると比べると実行速度べると実行する機械語に変速度を向上することを高速化するため向上はインタプリタすることが求められる場所できる
    ● この意味で、で、いいですよね。JITは全然使えないんCPUやOSに詳しいというわ依存しない実行形式しない実行する機械語に変形式を配布できる、を高速化するため配布できる、というできる、いいですよね。というテーマはとてつ
    インタを最初に捨てるプとリが飛んできやすタを最初に捨てるの利点を保ったまま、を高速化するため保ったまま、実行ったまま、いいですよね。実行する機械語に変速度を向上することが求められる場所遅いい、いいですよね。というテーマはとてつ欠点を保ったまま、を高速化するため克服しし
    ようテーマはとてつとするものといえる。

    View Slide

  22. Numbaのインストール
    $pip install numba

    View Slide

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

    View Slide

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

    View Slide

  25. View Slide

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

    View Slide

  27. 反省

    numpyに詳しいというわ対してなら速くなしてなら速くなるというテーマはとてつ記事だけど話さないが求められる場所あったり速いする

    https://qiita.com/toyolab/items/b5d95bd38b3c7c66b510
    ● いい加減な気持ちでな気持ちでちでNumba/JITを高速化するため使えないんですよっても高速化するためのできる
    わけでは全然使えないんないらしい

    JITの話は全然使えないんまた別の回にしましょの機会に詳しいというわ深いくやり速いましょうテーマはとてつ

    View Slide

  28. Cython

    View Slide

  29. Cython

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

    SAGEで使えないんですよわれている

    View Slide

  30. Cythonで改善するコードするコード
    ● ループと処理とか分散処理と
    ● 演算処理とか分散処理と
    ● 関しては重いので数をキャッシュ呼び出したり、び出る書き方」ではし

    View Slide

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

    View Slide

  32. distutils で Cython モ化 ジュールを高速化するためビルドする

    hello.pyxを高速化するため用意

    setup.pyを高速化するため用意

    $python setup.py build_ext --inplace でモ化 ジュールを高速化するためビルド

    Pythonのインタを最初に捨てるプとリが飛んできやすタを最初に捨てるからfrom hello import say_hello_to
    を高速化するため実行する機械語に変し、いいですよね。 import した関しては重いので数をキャッシュを高速化するため使えないんですようテーマはとてつ

    View Slide

  33. hello.pyx
    setup.py

    View Slide

  34. SWIG

    View Slide

  35. SWIG

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

    PythonからCの関しては重いので数をキャッシュを高速化するため呼び出したり、べるようテーマはとてつに詳しいというわなる

    View Slide

  36. インストール (Ubuntu18.04)
    ● 公式を配布できる、サイトからバイナリが飛んできやすファイルを高速化するためダウンロード
    ● 圧縮ファイルを展開ファイルを高速化するため展開

    $ ./configure

    $ make

    $ sudo make install

    View Slide

  37. http://rinatz.github.io/swigdoc/tutorial.html

    View Slide

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

    View Slide

  39. PyPy

    View Slide

  40. PyPy

    Pythonで記述すると、されたPythonの処理とか分散処理と系は、表面上はイ

    RPython (Restricted Python) で記述すると、されている

    Cythonより速い速い これを高速化するためそのまま(?)使えないんですようテーマはとてつとさらに詳しいというわ速いらしい

    View Slide

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

    View Slide

  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]

    View Slide

  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))

    View Slide

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

    Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ

    Dask (並列・分散処理を避ける)

    View Slide

  45. Dask

    View Slide

  46. Dask

    Pythonで並列処理とか分散処理と・分散処理とか分散処理となど話さないことを高速化するため簡単に詳しいというわ扱ってくれってくれ

    ● データを最初に捨てるを高速化するため全てメモ化 リが飛んできやすに詳しいというわ乗せず、部分的なせず、いいですよね。部で分的として開発されなかたまり速い単位の
    でメモ化 リが飛んできやすに詳しいというわ乗せず、部分的なせたり速いして計算するので、いいですよね。通常はは全然使えないん
    Pandasなど話さないことでメモ化 リが飛んできやすに詳しいというわ乗せず、部分的なり速い切らない大きなデらない大きなデータを最初に捨てる
    セットでも扱ってくれえる
    https://qiita.com/simonritchie/items/e174f243bc03fb25462e

    View Slide

  47. データを最初に捨てるの大きさ
    Data Science with Python and Dask

    View Slide

  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

    View Slide

  49. View Slide

  50. View Slide

  51. View Slide

  52. 他にもに詳しいというわも...

    vaex

    Koalas

    View Slide

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

    View Slide

  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入りしない門

    View Slide

  55. 参考えず使ってみる文を避ける献 (Dask)

    PythonのDaskを高速化するためしっかり速い調べてみた(大きべてみた(大きなデータを最初に捨てるセットを高速化するため
    快適に詳しいというわ扱ってくれうテーマはとてつ)
    ● 時間となるように最のかかる前処理とか分散処理とを高速化するためDaskで高速化するための - ぴよぴよ.py

    Data Science with Python and Dask

    DASK: Pythonでの並列処理とか分散処理と - Python Kansai #01

    Python Dask で 並列 DataFrame 処理とか分散処理と - StatsFragments

    View Slide

  56. より速い発展的として開発されな内容

    Matthew Page - How to JIT: Writing a Python
    JIT from scratch in pure Python - PyCon 2019

    View Slide