API/C memory mananegemnt problem
Fredrik Lundh
fredrik at pythonware.com
Fri Mar 10 04:06:41 EST 2006
fumana at lambrate.inaf.it wrote:
> In my C-module I have a loop like this:
> ***********************************************
>
> int size=10000000;
>
> output=(double *) calloc(size, sizeof(double));
> py_output=PyList_New(0);
> for(i=0; i<size; i++){
> tmp=PyFloat_FromDouble(output[i]);
> PyList_Append(py_output, tmp);
Py_DECREF(tmp); // append adds a reference
> }
>
> free(outout);
>
> return py_output;
or with proper error handling:
int size=10000000;
output=(double *) calloc(size, sizeof(double));
if (!output) {
PyErr_NoMemory();
return NULL;
}
py_output=PyList_New(0);
if (!py_output)
goto error;
for(i=0; i<size; i++){
tmp=PyFloat_FromDouble(output[i]);
if (!tmp)
goto error;
if (PyList_Append(py_output, tmp) < 0)
goto error;
Py_DECREF(tmp);
}
free(outout);
return py_output;
error:
Py_XDECREF(py_output);
free(output);
return NULL;
or optimized for speed:
...
py_output = PyList_New(size);
if (!py_output)
goto error;
for (i = 0; i < size; i++) {
tmp = PyFloat_FromDouble(output[i]);
if (!tmp)
goto error;
PyList_SET_ITEM(py_output, tmp);
// don't decref here
}
...
hope this helps!
</F>
More information about the Python-list
mailing list