差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
| c_cpp:boost:boost_python [2020/08/27 17:45] – [ソリューションの設定] ともやん | c_cpp:boost:boost_python [2021/07/05 01:59] (現在) – ともやん | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | < | ||
| - | < | ||
| - | #result pre, #mincode pre { | ||
| - | overflow: hidden; | ||
| - | font-size: 10px; | ||
| - | } | ||
| - | # | ||
| - | height: 250px; | ||
| - | overflow: scroll; | ||
| - | overflow-x: hidden; | ||
| - | font-size: 10px; | ||
| - | } | ||
| - | #mintbl table { | ||
| - | font-size: 12px; | ||
| - | } | ||
| - | .dokuwiki .plugin_wrap table { | ||
| - | width: auto; | ||
| - | } | ||
| - | #logo { | ||
| - | background-color: | ||
| - | padding: 10px; | ||
| - | width: fit-content; | ||
| - | } | ||
| - | #logo p { | ||
| - | margin: 0; | ||
| - | } | ||
| - | </ | ||
| - | </ | ||
| ====== Boost.Python - Boost Python Library ====== | ====== Boost.Python - Boost Python Library ====== | ||
| + | 本家: [[https:// | ||
| + | |||
| **Boost Python Library** は、Python と C++ を連携させるためのフレームワークである。Dave Abrahams の C++ コンパイラだけで、特別なツールを使用することなく、C++ クラスの関数やオブジェクトを Python に素早くシームレスに公開できる。\\ | **Boost Python Library** は、Python と C++ を連携させるためのフレームワークである。Dave Abrahams の C++ コンパイラだけで、特別なツールを使用することなく、C++ クラスの関数やオブジェクトを Python に素早くシームレスに公開できる。\\ | ||
| 行 42: | 行 16: | ||
| {{c_cpp: | {{c_cpp: | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| < | < | ||
| 言語: Python | 言語: Python | ||
| 行 53: | 行 27: | ||
| 以下の内容で新しいプロジェクトを構成して **[作成]** をクリックする。\\ | 以下の内容で新しいプロジェクトを構成して **[作成]** をクリックする。\\ | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| < | < | ||
| プロジェクト名: | プロジェクト名: | ||
| 行 95: | 行 69: | ||
| **PyHelloBoostPython** プロジェクトの **PyHelloBoostPython.py** ファイルに以下のコードを貼り付ける。\\ | **PyHelloBoostPython** プロジェクトの **PyHelloBoostPython.py** ファイルに以下のコードを貼り付ける。\\ | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| <code python PyHelloBoostPython.py> | <code python PyHelloBoostPython.py> | ||
| # | # | ||
| 行 102: | 行 76: | ||
| from random import random | from random import random | ||
| import timeit | import timeit | ||
| - | from superfastcode | + | from superfastcode_cpython |
| - | from superfastcode_bst | + | from superfastcode_boost |
| COUNT = 500000 | COUNT = 500000 | ||
| 行 156: | 行 130: | ||
| {{c_cpp: | {{c_cpp: | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| < | < | ||
| 言語: C++ | 言語: C++ | ||
| 行 167: | 行 141: | ||
| 以下の内容で新しいプロジェクトを構成して **[作成]** をクリックする。\\ | 以下の内容で新しいプロジェクトを構成して **[作成]** をクリックする。\\ | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| < | < | ||
| プロジェクト名: | プロジェクト名: | ||
| 行 177: | 行 151: | ||
| **superfastcode_cpython** プロジェクトを右クリックして、**[追加] - [新しい項目...]** をクリックする。\\ | **superfastcode_cpython** プロジェクトを右クリックして、**[追加] - [新しい項目...]** をクリックする。\\ | ||
| 以下の内容で新しい項目を追加する。\\ | 以下の内容で新しい項目を追加する。\\ | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| < | < | ||
| 種類: C++ ファイル (.cpp) | 種類: C++ ファイル (.cpp) | ||
| 行 193: | 行 167: | ||
| これにより、**Debug、Release、Win32、x64** のすべての組み合わせについての設定を変更する。\\ | これにより、**Debug、Release、Win32、x64** のすべての組み合わせについての設定を変更する。\\ | ||
| **CPython プロジェクト** (Python 用 C++ 拡張機能) のビルドに必要な設定の概要は以下の通りである。\\ | **CPython プロジェクト** (Python 用 C++ 拡張機能) のビルドに必要な設定の概要は以下の通りである。\\ | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| < | < | ||
| [構成プロパティ] - [全般] - [構成の種類]: | [構成プロパティ] - [全般] - [構成の種類]: | ||
| 行 211: | 行 185: | ||
| ※ここでは [[windows: | ※ここでは [[windows: | ||
| < | < | ||
| - | %USERPROFILE%\scoop\apps\python\current\include | + | $(USERPROFILE)\scoop\apps\python\current\include |
| </ | </ | ||
| + | **※構成プロパティでは< | ||
| {{c_cpp: | {{c_cpp: | ||
| 行 218: | 行 193: | ||
| ※ここでは [[windows: | ※ここでは [[windows: | ||
| < | < | ||
| - | %USERPROFILE%\scoop\apps\python\current\libs | + | $(USERPROFILE)\scoop\apps\python\current\libs |
| </ | </ | ||
| + | **※構成プロパティでは< | ||
| {{c_cpp: | {{c_cpp: | ||
| 上記のすべての設定が終わったら、プロジェクトのプロパティ ページの **[OK]** をクリックする。\\ | 上記のすべての設定が終わったら、プロジェクトのプロパティ ページの **[OK]** をクリックする。\\ | ||
| **superfastcode_cpython** プロジェクトの **cpython_module.cpp** ファイルに以下の内容を貼り付ける。\\ | **superfastcode_cpython** プロジェクトの **cpython_module.cpp** ファイルに以下の内容を貼り付ける。\\ | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| <code cpp cpython_module.cpp> | <code cpp cpython_module.cpp> | ||
| #include < | #include < | ||
| 行 261: | 行 237: | ||
| static PyModuleDef superfastcode_module = { | static PyModuleDef superfastcode_module = { | ||
| PyModuleDef_HEAD_INIT, | PyModuleDef_HEAD_INIT, | ||
| - | "superfastcode", | + | "superfastcode_cpython", |
| " | " | ||
| 0, | 0, | ||
| 行 267: | 行 243: | ||
| }; | }; | ||
| - | PyMODINIT_FUNC | + | PyMODINIT_FUNC |
| return PyModule_Create(& | return PyModule_Create(& | ||
| } | } | ||
| 行 277: | 行 253: | ||
| {{c_cpp: | {{c_cpp: | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| < | < | ||
| 言語: C++ | 言語: C++ | ||
| 行 288: | 行 264: | ||
| 以下の内容で新しいプロジェクトを構成して **[作成]** をクリックする。\\ | 以下の内容で新しいプロジェクトを構成して **[作成]** をクリックする。\\ | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| < | < | ||
| プロジェクト名: | プロジェクト名: | ||
| 行 298: | 行 274: | ||
| **superfastcode_boost** プロジェクトを右クリックして、**[追加] - [新しい項目...]** をクリックする。\\ | **superfastcode_boost** プロジェクトを右クリックして、**[追加] - [新しい項目...]** をクリックする。\\ | ||
| 以下の内容で新しい項目を追加する。\\ | 以下の内容で新しい項目を追加する。\\ | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| < | < | ||
| 種類: C++ ファイル (.cpp) | 種類: C++ ファイル (.cpp) | ||
| 行 311: | 行 287: | ||
| これにより、**Debug、Release、Win32、x64** のすべての組み合わせについての設定を変更する。\\ | これにより、**Debug、Release、Win32、x64** のすべての組み合わせについての設定を変更する。\\ | ||
| **Boost.Python プロジェクト** (Python 用 C++ 拡張機能) のビルドに必要な設定の概要は以下の通りである。\\ | **Boost.Python プロジェクト** (Python 用 C++ 拡張機能) のビルドに必要な設定の概要は以下の通りである。\\ | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| < | < | ||
| [構成プロパティ] - [全般] - [構成の種類]: | [構成プロパティ] - [全般] - [構成の種類]: | ||
| 行 329: | 行 305: | ||
| ※ここでは [[windows: | ※ここでは [[windows: | ||
| < | < | ||
| - | %USERPROFILE%\scoop\apps\python\current\include | + | $(USERPROFILE)\scoop\apps\python\current\include |
| </ | </ | ||
| + | **※構成プロパティでは< | ||
| {{c_cpp: | {{c_cpp: | ||
| 行 336: | 行 313: | ||
| ※ここでは [[windows: | ※ここでは [[windows: | ||
| < | < | ||
| - | %USERPROFILE%\scoop\apps\python\current\libs | + | $(USERPROFILE)\scoop\apps\python\current\libs |
| </ | </ | ||
| + | **※構成プロパティでは< | ||
| {{c_cpp: | {{c_cpp: | ||
| 上記のすべての設定が終わったら、プロジェクトのプロパティ ページの **[OK]** をクリックする。\\ | 上記のすべての設定が終わったら、プロジェクトのプロパティ ページの **[OK]** をクリックする。\\ | ||
| **superfastcode_boost** プロジェクトの **boost_module.cpp** ファイルに以下の内容を貼り付ける。\\ | **superfastcode_boost** プロジェクトの **boost_module.cpp** ファイルに以下の内容を貼り付ける。\\ | ||
| - | <WRAP prewrap 100% #mincode> | + | <WRAP prewrap 100% mincode> |
| <code cpp boost_module.cpp> | <code cpp boost_module.cpp> | ||
| #include < | #include < | ||
| 行 362: | 行 340: | ||
| } | } | ||
| - | BOOST_PYTHON_MODULE(superfastcode_bst) | + | BOOST_PYTHON_MODULE(superfastcode_boost) |
| { | { | ||
| using namespace boost:: | using namespace boost:: | ||
| 行 375: | 行 353: | ||
| **アクティブ ソリューション構成: | **アクティブ ソリューション構成: | ||
| - | <WRAP prewrap 100% #mintbl> | + | <WRAP prewrap 100% mintbl> |
| - | ^ プロジェクト | + | ^ プロジェクト |
| - | |superfastcode_boost | + | |superfastcode_boost |
| - | |superfastcode_cpython | + | |superfastcode_cpython |
| + | <wrap hi> | ||
| </ | </ | ||
| {{c_cpp: | {{c_cpp: | ||
| **アクティブ ソリューション構成: | **アクティブ ソリューション構成: | ||
| - | <WRAP prewrap 100% #mintbl> | + | <WRAP prewrap 100% mintbl> |
| - | ^ プロジェクト | + | ^ プロジェクト |
| - | |superfastcode_boost | + | |superfastcode_boost |
| - | |superfastcode_cpython | + | |superfastcode_cpython |
| + | <wrap hi> | ||
| </ | </ | ||
| {{c_cpp: | {{c_cpp: | ||
| + | |||
| + | **ソリューション エクスプローラー** より **PyHelloBoostPython** ソリューションを右クリックして、**[プロパティ]**をクリックする。\\ | ||
| + | **シングル スタートアップ プロジェクト**が **PyHelloBoostPython** であることを確認する。\\ | ||
| + | {{c_cpp: | ||
| + | |||
| + | ==== ソリューション内の Python プロジェクトで C++ 拡張機能 プロジェクトを参照する ==== | ||
| + | **superfastcode_cpython**、および、**superfastcode_boost** プロジェクトの Python 用 C++ 拡張機能は、同一ソリューション内であってもそのままでは Python から import できない。\\ | ||
| + | {{c_cpp: | ||
| + | |||
| + | **PyHelloBoostPython** プロジェクトの**[参照]**を右クリックして、**[参照の追加...]**をクリックする。\\ | ||
| + | {{c_cpp: | ||
| + | |||
| + | **superfastcode_cpython**、および、**superfastcode_boost** プロジェクトのチェックボックスをオンにして **[OK]** をクリックする。\\ | ||
| + | {{c_cpp: | ||
| + | |||
| + | 以下のように **PyHelloBoostPython** プロジェクトの参照に C++ 拡張機能 プロジェクトが追加されて、検索パス (**x64\Release**) にビルド出力の ***.pyd** ファイルが配置されるので Python プロジェクトから **import** することが可能になる。\\ | ||
| + | {{c_cpp: | ||
| + | |||
| + | ==== Python プロジェクトの実行 ==== | ||
| + | Visual Studio の画面で **Ctrl + F5**(デバッグなしで開始) キーを押して実行する。\\ | ||
| + | Python コードと C++ コードの実行速度のベンチマーク結果が表示される。\\ | ||
| + | <WRAP prewrap 100% #result> | ||
| + | <code powershell> | ||
| + | Running benchmarks with COUNT = 500000 x NUM_OF_EXEC = 30 | ||
| + | [tanh(x) for x in d] (Python implementation) took 1.930 seconds | ||
| + | [fast_tanh(x) for x in d] (CPython C++ implementation) took 0.248 seconds | ||
| + | [boost_tanh(x) for x in d] (Boost.Python C++ implementation) took 0.289 seconds | ||
| + | 続行するには何かキーを押してください . . . | ||
| + | </ | ||
| + | </ | ||
| ===== 参考文献 ===== | ===== 参考文献 ===== | ||
| [[https:// | [[https:// | ||
| [[http:// | [[http:// | ||
| + | |||
| + | [[http:// | ||
| + | [[https:// | ||
| + | [[https:// | ||
| + | [[https:// | ||