Python プログラムの C 拡張では、メインの C 関数 (何百万回も呼び出される) への 2 つの入力をグローバル変数として設定することでパフォーマンスを改善しようとしています。ラムダラッパーを使用してPythonからC関数にそれらを供給し続ける必要はありません(これはかなりの時間を無駄にします)。私のコードは次のようになります。まず、ファイルの先頭でグローバル変数を宣言します。
unsigned char* splitArray;
PyObject* wordCmp;
次に、Python API 関数を使用してそれらを設定します。
static PyObject* py_set_globals(PyObject *self, PyObject *args)
{
free(wordCmp);
free(splitArray);
char* splitChars;
PyObject* wordC;
if (!PyArg_ParseTuple(args, "sO", &splitChars, &wordC))
return NULL;
wordCmp = (PyObject*)malloc(sizeof(PyObject));
memcpy(wordCmp, wordC, sizeof(PyObject));
splitArray = splitchars_to_mapping(splitChars);
return Py_BuildValue("");
}
この場合、splitArray は関数 splitchars_to_mapping で malloc される 128 文字の配列に割り当てられ、wordCmp は C に渡される Python 関数オブジェクトです。とにかく、私が知る限り、char* splitArray は機能しますグローバル変数としては問題ありませんが、後で PyEval_CallObject を使用して wordCmp を呼び出そうとすると、Python/C がクラッシュします。だから私は2つの質問があります:
- 関数の先頭にある初期化されていないポインター wordCmp と splitArray を解放しようとすると、C がすぐにクラッシュしないのはなぜですか?
- wordCmp をヒープに適切に保存し、それへの参照をグローバルとして保存したのに、後で wordCmp を呼び出すことができないのはなぜですか?