Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

高速化するためのの方法 ● 計算負荷の高い処理を避の高い処理を避け高い処理を避けるい処理を避ける処理を避けるを避ける避けるける ● アルゴリが飛んできやすズムの改良の改良 ● 並列処理とか分散処理と ● 分散処理とか分散処理と ● Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ ● Dask (並列・分散処理とか分散処理と)

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

● Pythonでプとログすることラムの改良を高速化するため書く時には、「パく時に詳しいというわは全然使えないん、いいですよね。「パフォーマはとてつもなくン スが求められる場所出る書き方」ではる書く時には、「パき方」というテーマはでは全然使えないんなく、いいですよね。「読みやすい書き方みやすい書く時には、「パき方」というテーマは を高速化するため心がけよう。が求められる場所けようテーマはとてつ。 ● パフォーマはとてつもなくンス重いので次回や視で書いても、そで書く時には、「パいても、いいですよね。そんなに詳しいというわは全然使えないん速くは全然使えないん ならない。 ● for 文を避けるを高速化するため使えないんですよったほうテーマはとてつが求められる場所読みやすい書き方みやすい、いいですよね。と思ったら、迷ったら、いいですよね。迷 わずに詳しいというわ for 文を避けるを高速化するため使えないんですよえばよい。 https://atsuoishimoto.hatenablog.com/entry/2019/01/18/180020

Slide 9

Slide 9 text

高速化するためのの方法 ● 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける ● アルゴリズムの改良の高い処理を避け改良 ● 並列処理とか分散処理と ● 分散処理とか分散処理と ● Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ ● Dask (並列・分散処理とか分散処理と)

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

高速化するためのの方法 ● 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける ● アルゴリが飛んできやすズムの改良の改良 ● 並列処理を避ける ● 分散処理とか分散処理と ● Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ ● Dask (並列・分散処理とか分散処理と)

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

高速化するためのの方法 ● 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける ● アルゴリが飛んできやすズムの改良の改良 ● 並列処理とか分散処理と ● 分散処理を避ける ● Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ ● Dask (並列・分散処理とか分散処理と)

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

高速化するためのの方法 ● 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける ● アルゴリが飛んできやすズムの改良の改良 ● 並列処理とか分散処理と ● 分散処理とか分散処理と ● Pythonより速い速いい処理を避けるPythonを避ける使うう ● Dask (並列・分散処理とか分散処理と)

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Numba

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Cython

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

hello.pyx setup.py

Slide 34

Slide 34 text

SWIG

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

PyPy

Slide 40

Slide 40 text

PyPy ● Pythonで記述すると、されたPythonの処理とか分散処理と系は、表面上はイ ● RPython (Restricted Python) で記述すると、されている ● Cythonより速い速い これを高速化するためそのまま(?)使えないんですようテーマはとてつとさらに詳しいというわ速いらしい

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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]

Slide 43

Slide 43 text

速度を向上することの比べると実行速度較 $ 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))

Slide 44

Slide 44 text

高速化するためのの方法 ● 計算負荷の高い処理を避の高い処理とか分散処理とを高速化するため避けるける ● アルゴリが飛んできやすズムの改良の改良 ● 並列処理とか分散処理と ● 分散処理とか分散処理と ● Pythonより速い速いPythonを高速化するため使えないんですようテーマはとてつ ● Dask (並列・分散処理を避ける)

Slide 45

Slide 45 text

Dask

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

他にもに詳しいというわも... ● vaex ● Koalas

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

参考えず使ってみる文を避ける献 ● 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入りしない門

Slide 55

Slide 55 text

参考えず使ってみる文を避ける献 (Dask) ● PythonのDaskを高速化するためしっかり速い調べてみた(大きべてみた(大きなデータを最初に捨てるセットを高速化するため 快適に詳しいというわ扱ってくれうテーマはとてつ) ● 時間となるように最のかかる前処理とか分散処理とを高速化するためDaskで高速化するための - ぴよぴよ.py ● Data Science with Python and Dask ● DASK: Pythonでの並列処理とか分散処理と - Python Kansai #01 ● Python Dask で 並列 DataFrame 処理とか分散処理と - StatsFragments

Slide 56

Slide 56 text

より速い発展的として開発されな内容 ● Matthew Page - How to JIT: Writing a Python JIT from scratch in pure Python - PyCon 2019