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

Pybind11でC++とPythonのいいとこ取りをする

yumcyawiz
September 13, 2020

 Pybind11でC++とPythonのいいとこ取りをする

Slide for OSK2020 September Lightning Talk

yumcyawiz

September 13, 2020
Tweet

More Decks by yumcyawiz

Other Decks in Technology

Transcript

  1. Pybind11でC++とPythonの
    いいとこ取りをする
    2020/09/13 OSK 9月LT会
    @yumcyawiz

    View full-size slide

  2. Motivation
    Pythonはnumpyとかmatplotlibとか色々あって便利!

    View full-size slide

  3. Motivation
    だけど複雑な計算を実装すると遅い・・

    View full-size slide

  4. Motivation
    一方でC++は計算早いけど、可視化とか不便・・

    View full-size slide

  5. Motivation
    C++で計算を実装して、Pythonで可視化できないか?

    View full-size slide

  6. • C++・Python間で互いのデータ型・関数を扱えるように
    するC++のHeader Onlyライブラリ
    • STLのデータ型もサポート
    • numpyのデータ型も扱える

    View full-size slide

  7. Usage - Setup

    View full-size slide

  8. Project Setup
    • 今回はC++側でMyLibという名
    前の静的ライブラリを作成
    • Python側でMyLibを呼び出せる
    ようにしたい

    View full-size slide

  9. Project Setup - CMake
    • CMakeを使ってpybind11を導入
    • Python Bindingをbinding.cppに
    記述
    • pybind11_add_moduleで
    binding.cppをソースに指定

    View full-size slide

  10. Project Setup - Build
    • ビルドするとMyLib.*.soが生成
    される
    • Python Scriptと同じディレクト
    リに置けばimport Mylibできる

    View full-size slide

  11. Usage - Function

    View full-size slide

  12. Function
    mylib.cpp
    binding.cpp
    Binding.cppにPython Bindingを記述していく

    View full-size slide

  13. Function
    binding.cpp
    Python側から呼び出せる
    test.py

    View full-size slide

  14. Function – default argument
    binding.cpp
    名前付き引数&デフォルト引数も設定可能
    mylib.h

    View full-size slide

  15. Function – reference
    test.py
    参照型も基本的には問題なく使える
    ただしstr, bool, intなどPython側でImmutableな型
    は関数内の変更が反映されない
    mylib.cpp
    0

    View full-size slide

  16. Usage - Class

    View full-size slide

  17. Class
    Vec3クラスをPythonから使えるようにする
    mylib.h binding.cpp test.py
    0x7fb66ccd8f30>

    View full-size slide

  18. Class - member
    メンバ変数へのアクセス
    関数の時と同様にバインドを作成できる
    binding.cpp test.py

    View full-size slide

  19. Class - print
    printでVec3の中身を表示
    __repr__を定義する
    binding.cpp test.py
    (1.000000, 2.000000,
    3.000000)

    View full-size slide

  20. Class - element
    要素アクセスしたい場合
    __getitem__を定義する
    binding.cpp
    test.py
    2

    View full-size slide

  21. Class - numpy
    Vec3をnumpy arrayとして読み込めるようにしたい
    Buffer Protocolを利用することで可能
    binding.cpp
    test.py
    [2. 4. 6.]

    View full-size slide

  22. Reference
    紹介したコードは以下のrepoで公開してます
    https://github.com/yumcyaWiz/pybind11_tutorial

    View full-size slide

  23. LensSim
    • Ray Tracingによって写真レンズの性能評価・映り方のシミュ
    レーションを行うツール

    View full-size slide

  24. LensSim
    C++
    • レンズの読み込み
    • レイトレーシング
    • 各種性能計算
    • IBLによるレンダリング
    Python
    • 可視化(matplotlib)
    複雑な計算を実装し、ライブラリ化 可視化周り

    View full-size slide

  25. LensSim – Optical Path Diagram
    Python
    matplotlibを用いて光路図を表示する
    C++

    View full-size slide

  26. LensSim – Exit Pupil Plot
    Python
    matplotlibを用いて射出瞳を表示する
    C++

    View full-size slide

  27. Reference
    LensSimは以下のrepoで公開してます
    https://github.com/yumcyaWiz/LensSim

    View full-size slide

  28. Thank you for listening!

    View full-size slide