Подход, который работал для меня:
Прежде чем создавать большую строку C, выделите для нее память с помощью Python:
PyObject *pystr = PyString_FromStringAndSize(NULL, size);
char *str = PyString_AS_STRING(pystr);
/* now fill <str> with <size> bytes */
Таким образом, когда приходит время передать его Python, вам не нужно создавать копию:
PyObject *result = PyObject_CallFunctionObjArgs(callable, pystr, NULL);
/* or PyObject_CallFunction(callable, "O", pystr) if you prefer */
Обратите внимание, что вы не должны изменять строку, как только это будет сделано.