これは古い質問だと思いますが、Google で のようなものを検索すると出てきます。ctypes vs cython
ここでの回答のほとんどは、既に熟達している人によって書かれているcython
かc
、それらを学ぶために費やした実際の時間を反映していない可能性があります。ソリューションを実装します。どちらも全くの初心者です。私はこれまで触れたことがなくcython
、経験もほとんどありませんc/c++
。
この 2 日間、コードのパフォーマンスの高い部分を Python よりも低レベルのものに委譲する方法を探していました。基本的に 2 つの単純な関数で構成されるctypes
との両方にコードを実装しました。Cython
処理が必要な巨大な文字列リストがありました。注意事項list
とstring
. c
Python の文字列はデフォルトで Unicode であり、文字列はそうではないため、両方の型が の型に完全に対応してc
いるわけではありません。Python のリストは単に c の配列ではありません。
これが私の評決です。を使用しcython
ます。Python との統合がよりスムーズになり、一般的に操作が容易になります。何か問題がctypes
発生して segfault がスローcython
されると、少なくとも可能な限りスタック トレースでコンパイル警告が表示され、有効な python オブジェクトを簡単に返すことができますcython
。
これは、同じ機能を実装するために両方に投資する必要があった時間の詳細な説明です。ちなみに、C/C++ プログラミングはほとんどしませんでした。
Cタイプ:
- 私のユニコード文字列のリストをac互換タイプに変換する方法を研究するのに約2時間。
- ac 関数から適切に文字列を返す方法についての約 1 時間。ここでは、関数を作成したら、実際にSOに独自のソリューションを提供しました。
- C でコードを記述し、動的ライブラリにコンパイルするのに約 30 分かかります。
- Python でテスト コードを記述して、
c
コードが機能するかどうかを確認するのに 10 分かかります。
- いくつかのテストを行い、
c
コードを再配置するのに約 1 時間。
c
次に、コードを実際のコードベースにプラグインしましたが、モジュールのハンドラーがデフォルトで選択できないため、モジュールctypes
でうまく機能しないことがわかりました。multiprocessing
- 約 20 分、モジュールを使用しないようにコードを再配置し、
multiprocessing
再試行しました。
- 次に、コードの 2 番目の関数は
c
、テスト コードに合格しましたが、コード ベースで segfaults を生成しました。ええと、これはおそらくエッジケースをうまくチェックしなかった私のせいです。私は簡単な解決策を探していました。
- 約 40 分間、これらのセグメンテーション違反の考えられる原因を突き止めようとしました。
- 関数を 2 つのライブラリに分割して、もう一度試しました。私の2番目の機能にはまだセグメンテーション違反がありました。
- 私は2番目の関数を手放し、
c
コードの最初の関数のみを使用することに決め、それを使用するpythonループの2回目または3回目の繰り返しで、UnicodeError
すべてをエンコードおよびデコードしましたが、ある位置でバイトをデコードしないことについて話しました明示的に。
この時点で、代替案を探すことにし、以下を調べることにしましたcython
。
- シトン
- cython hello worldを 10 分間読む。
- の代わりにcython を使用する方法についてSOを確認する 15 分間。
setuptools
distutils
- cython 型と python 型に関する 10 分間の読み物。組み込みの Python 型のほとんどを静的型付けに使用できることを学びました。
- Python コードに cython 型を再注釈付けするのに 15 分。
setup.py
コードベースでコンパイル済みモジュールを使用するように my を変更する 10 分。
multiprocessing
モジュールをコードベースのバージョンに直接プラグインしました。できます。
記録のために、もちろん、私は投資の正確なタイミングを測定しませんでした. 私が ctypes を扱っている間、あまりにも多くの精神的努力が必要だったために、私の時間の認識が少し注意深いものだったのかもしれません。しかし、それは扱う感覚を伝える必要がcython
ありますctypes