Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonで、処理をより効率化するためのTips集

hiroaki
September 17, 2019
11k

 Pythonで、処理をより効率化するためのTips集

PyConJP 2019 二日目LT

hiroaki

September 17, 2019
Tweet

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide