web-dev-qa-db-ja.com

Cythonの代わりにPython / Cインターフェースを使用する利点はありますか?

BLASとLAPACKを使用してCまたはC++でいくつかのモジュールを記述し、pythonとnumpyを拡張したい。また、コードをスタンドアロンのC/C++ライブラリとして配布できるようにしたい。このライブラリは、単精度と倍精度の両方の浮動小数点数を使用します。私が作成する関数の例としては、線形システムを解くための共役勾配や加速された1次メソッドがあります。関数によっては、Python C/C++コード。

Python/CAPIとNumpy/C APIで少し遊んだ後、多くの人が代わりにCythonの使用を提唱していることを発見しました(たとえば、 この質問 または これ を参照) =)。私はCythonの専門家ではありませんが、 場合によっては の場合でも、Numpy/C APIを使用して、その動作を理解する必要があるようです。私はすでにPython/C APIについて(少し)知識があり、Cythonについては何も知らないという事実を考えると、Python/C APIを使い続けることが理にかなっているのか、そしてこのAPIを使用することでCythonよりもいくつかの利点があるのか​​疑問に思いました。 。将来的には、数値計算を伴わないものも確実に開発していくので、この質問はnumpyだけではありません。 Python/C APIについて私が気に入っていることの1つは、Pythonインタープリターがどのように機能しているかについていくつかのことを学んでいるという事実です。

ありがとう。

44
Edouard

まず、私が得られないあなたの質問の1つのポイントがあります:

[...]また、スタンドアロンのC/C++ライブラリとしてコードを配布できるようにしたいと考えています。 [...]一部の関数は、C/C++コードからPython関数を呼び出す必要があります。

これはどのように機能するはずですか?

次に、実際の質問に関しては、Python/CAPIを直接使用することには確かに利点があります。

  • おそらく、Cythonコードを書くよりもCコードを書くことに慣れているでしょう。

  • Cでコードを書くと、最大限の制御が可能になります。 Cythonコードから同等のCコードと同じパフォーマンスを得るには、非常に注意する必要があります。すべての変数の型を宣言する必要があるだけでなく、いくつかのフラグを適切に設定する必要があります-ほんの一例は 境界チェック です。最高のパフォーマンスを得るには、Cythonがどのように機能しているかについての深い知識が必要です。

  • CythonコードはPythonに依存しています。 CythonでスタンドアロンのCライブラリとしても配布する必要のあるコードを書くのは良い考えではないようです。

10
Sven Marnach

現在の「トップアンサー」は、私の耳にはFUDのように聞こえます。一つには、平均的な開発者がとにかくNumPy + Cythonが提供するものよりも速いコードをCで書くことはすぐには明らかではありません。まったく逆に、必要なCコードをPython環境で正しく動作させるのにかかる時間は、通常、Cythonでのクイックプロトタイプの作成、ベンチマーク、最適化にはるかによく投資されます。より高速な方法で書き直し、再度ベンチマークを行い、その後 2%の書き直しから得られるかどうかにかかわらず、本当に5〜10%高いパフォーマンスを必要とするものがあるかどうかを判断します。手作業で調整されたCでコードを作成し、Cythonコードから呼び出します。

私はCythonでライブラリを作成しています。このライブラリには、現在約18K行のCythonコードがあり、これは約200K行のCコードに変換されます。私はかつて、適切な場所に約20行の手動で調整されたCコードを挿入することにより、いくつかの非常に重要な内部基本レベル関数でほぼ25%の高速化を実現しました。この小さな部分を書き直して最適化するのに数時間かかりました。そもそもプレーンCでライブラリを作成しない(そして維持する必要がある)ことによって節約した膨大な時間と比較して、それは本当に何もありません。

CythonよりもCをよく知っていても、Python and Cを知っていれば、Cythonをすぐに習得できるので、特に投資する価値があります。数値に興味がある場合、作成するコードの80〜95%は、高水準言語で作成することで大きなメリットが得られるため、節約した時間の半分を安全にリラックスして、コードの高速化に投資できます。まるですぐに低水準言語で書いたかのように。

そうは言っても、「コードをスタンドアロンのC/C++ライブラリとして配布できるようにしたい」というあなたのコメントは、プレーンなC/C++に固執する正当な理由です。 Cythonは常にCPythonに依存していますが、これはかなりの依存関係です。ただし、プレーンC/C++(Pythonインターフェイスを除く)を使用すると、CPythonにも依存するため、NumPyを利用することもできません。したがって、Cで何かを書くときはいつものように、実際の機能に到達する前に、多くの基礎的な作業を行う必要があります。この作業を開始する前に、これについて2回真剣に考える必要があります。

80
Stefan Behnel

Python/C APIの主な欠点は、内部ループで使用すると非常に遅くなる可能性があることです。 Python関数を呼び出すと、同等のC++関数を呼び出すよりも80〜160倍のヒットが発生することがわかります。

それでもコードが気にならない場合は、Pythonでコードのチャンクを記述できること、Pythonライブラリ)にアクセスできること、Pythonで直接記述されたコールバックをサポートできることなどのメリットがあります。再コンパイルせずにいくつかの変更を加えることができるため、プロトタイピングが容易になります。

0
Adam