2022年8月14日日曜日

C++ & Python

C++ で Pythonのモジュールを作りたい。

初めは Python と C++ の exe をバッチファイルで繋ごうかと思いましたが、ライブラリにすればPython から直接読めます。

チュートリアルがあり、GitHub にテンプレートが公開されていました。それをトレースしましょう。https://docs.microsoft.com/ja-jp/visualstudio/python/working-with-c-cpp-python-in-visual-studio?view=vs-2022

まずは環境設定。
VS2019 は Python3.7 までのサポートのようです。これは古い。VS2019 を削除し、2022に入れなおし。これでデフォが3.9?でしょうか。デフォを3.10にしたかったのですが、入れ替え方がわかりません。
空のPythonプロジェクトを作り、新たに conda 環境を Python=3.10 で作成。これを新しいプロジェクトに対する既定の環境に設定。あらためて空の Python プロジェクトを作り、テンプレートのコードをコピぺしました。が、これではダメ。再度開くと3.9に戻ります。
Google先生に伺ったところ、[全般][インタープリター]で変更できました。
Python のみで動くように初期コードに書き換えた後、3.10で動作確認。OK でした。

次に C++。
既存のプロジェクトとして ’superfastcode’ を追加。VS2017 製でしたので[プロジェクト][ソリューションの再ターゲット]にてアップデート。’superfastcode’ というライブラリとして Python から呼び出せるとのこと。ソースファイル module.cpp は既に追加されている状態です。
プロジェクトのプロパティから、いくつかの設定を変更します。
・[全般][プロジェクトの既定値][構成の種類] dllを指定。
・[C/C++][全般][追加のインクルード ディレクトリ]新たに作成したenv下の include フォルダーを追加。
・[C/C++][コード生成][ランタイムライブラリ]マルチスレッドDLL (/MD
・[リンカー][全般][追加のライブラリディレクトリ] ]新たに作成したenv下の libs フォルダーを追加。

これで一度ビルド。OKです。
’superfastcode2’ も同様に取り込んで設定。採用していた conda 環境に pybind11 をインストールしておきます。念のため、Win11 を再起動してからビルド。
うーん、引っかかります。Python3.6が必要と出ます。どこでしょうか。

結局、原因がわからなかったので’superfastcode2’ はアンロード。
リリース環境でも同じ設定でビルド。で、試算。

Running benchmarks with COUNT = 500000
[tanh(x) for x in d] (Python implementation) took 0.512 seconds
[fast_tanh(x) for x in d] (CPython C++ extension) took 0.123 seconds
やはりCの方が速い。
チュートリアルを見ると pybind11 を使うと ’superfastcode’ より遅くなっていますので、ここまでにしておきましょう。

C++ でライブラリを作り、Python で読み込んで計算するチュートリアルでしたが、分かり難いですね。これ、gcc でも設定できるでしょうか。自信ないですね。

0 件のコメント:

コメントを投稿