파이썬 프로그램의 C 확장에서 전역 변수로 두 개의 입력을 주 C 함수 (수백만 번 호출)로 설정하여 성능을 향상 시키려고합니다. 그들은 자주 변경되지 않으므로, C 함수 (딱딱하지 않은 시간 낭비)에 람다 래퍼 (lambda wrapper)를 사용하여 파이썬에서 계속 제공 할 필요가 없습니다. 내 코드는 다음과 같습니다. 그런 다음C 파이썬 확장의 전역 PyObject * 변수
unsigned char* splitArray;
PyObject* wordCmp;
들을 설정하는 파이썬 API 기능 : 우선은 파일의 상단에있는 전역 변수를 선언 splitArray는 128 문자 배열에 할당이 경우
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("");
}
을하는 splitchars_to_mapping 함수에서 malloc 될 것입니다. 그리고 wordCmp는 C로 전달되는 파이썬 함수 객체입니다. 어쨌든, 내가 말할 수있는 한, char * splitArray는 전역 변수로 잘 작동하지만 나중에 wordCmp를 호출하려고 할 때 PyEval_CallObject를 사용하면 Python/C가 충돌합니다. 그래서 두 가지 질문이 있습니다
- 않는 이유는 바로 내가 함수의 시작 부분에서 초기화되지 않은 포인터 wordCmp 및 splitArray을 확보하려고하지 않을 때 C 충돌?
- 힙에 제대로 저장하고 글로벌 참조로 저장할 때 나중에 wordCmp를 호출 할 수없는 이유는 무엇입니까? 초기화되지 않은 전역 변수를 free'ing 때 충돌하지 않는 이유 첫 번째 질문,에 관해서는
좋아요, 감사를 참조하십시오. 그래서 내 선언은 "unsigned char * splitArray = NULL; PyObject * wordCmp = NULL;"와 동일합니다. – dpitch40
@ dpitch40 예 표준에 의해 보증됩니다.이 대답 참조 http://stackoverflow.com/a/6212973/1157444 – iabdalkader
@ dpitch40 업데이트 된 답변 확인 – iabdalkader