Slide 1

Slide 1 text

Pythonで、 処理をより効率化するための Tips集 PyCon JP 2019 長谷川大耀(@Hase8388)

Slide 2

Slide 2 text

自己紹介 長谷川大耀(@Hase8388)         で 主に広告分野での 機械学習の開発やってます

Slide 3

Slide 3 text

広告配信では、効率的な前処理が重要 機械学習のモデルは「生物(なまもの)」 データを効率的に処理してモデルに食わせたい そのためにやっている工夫について紹介します

Slide 4

Slide 4 text

TIPS: 1 巨大なデータセットを 逐次処理するための工夫

Slide 5

Slide 5 text

問題 まだ使用しないオブジェクトも、 メモリに乗ってしまう list( ) model.fit( )

Slide 6

Slide 6 text

解決策 yield文で必要な分だけ乗せて処理  model.fit( ) yield( )

Slide 7

Slide 7 text

さらにパイプラインも簡単に作れる yield( ) yield( ) yield( )

Slide 8

Slide 8 text

Tips: 2 重い処理を何度も何度も       しないための工夫

Slide 9

Slide 9 text

for i in range(N): request( ) 問題 何度も重い計算や外部APIを叩いてしまう 外部 サーバー

Slide 10

Slide 10 text

解決策 @lru_cacheで取得値を保存しておく 外部 サーバー for i in range(N): request

Slide 11

Slide 11 text

状態が変わる処理は、キャッシュをクリアに

Slide 12

Slide 12 text

TIPS3: データを加工するときに       行っている工夫

Slide 13

Slide 13 text

問題 One-Hot Encodingの処理に 時間とメモリを食う

Slide 14

Slide 14 text

解決策 scipy.sparseのcoo(座標)形式をうまく使う A : (y=0, x= 0) B : (y=1, x= 1) C : (y=2, x= 2) A : (y=3, x=0)

Slide 15

Slide 15 text

その他形式も、うまく使えば パフォーマンスUP! ● 他にも様々な特性が異なる形式が存在 ● どの形式も一長一短なことに注意 ! csc_matrix 列方向の処理に強い 行方向の処理に弱い csr_matrix 行方向の処理に強い 列方向の処理に弱い dia_matrix 算術演算に強い 疎行列は対角のみ

Slide 16

Slide 16 text

まとめ メモリを効率化するために、yieldでストリーム処理に置き換える 逐一取得しなくても良いようにキャッシュできないか考える 疎な行列の場合は、用途ごとにあった疎行列をうまく使う Python楽しい ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

Slide 17

Slide 17 text

エンジニアを積極採用中です ! Front-end Back-end Scala / Go Python JS / Elm React / RN

Slide 18

Slide 18 text

オフィス見学 / カジュアル面談も実施しております Wantedlyからお気軽にお申し込みください!