C API: array of floats/ints from python to C and back
Daniel Fetchinson
fetchinson at googlemail.com
Sat Dec 27 19:54:52 EST 2008
On 12/27/08, Robert Kern <robert.kern at gmail.com> wrote:
> Daniel Fetchinson wrote:
>
>> I agree that array.array is more efficient than a list but the input
>> for my function will come from PIL and PIL returns a list. So I have a
>> list to begin with which will be passed to the C function.
>
> With recent versions of PIL, numpy can create an array from an Image very
> quickly, possibly without any copying of memory.
>
> --
> Robert Kern
>
> "I have come to believe that the whole world is an enigma, a harmless enigma
> that is made terrible by our own mad attempt to interpret it as though it
> had
> an underlying truth."
> -- Umberto Eco
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>
Hi Robert, now that we are at it let me ask something related. Now I
managed to get my lists to C, operate on them in C and convert the
result back to a python tuple. Since this is my first C program that
uses the python C API I'm sure there are refcounting issues that I'm
not considering, maybe also memory management too.
This is the function I have, the corresponding python function will
take two equal length lists of integers and the C function will
compute their sum and return the result as a python tuple.
static PyObject *func( PyObject * self, PyObject * args )
{
int j, N;
int * src1, * src2;
PyObject *list1, *list2;
list1 = PyTuple_GetItem( args, 0 );
N = PyList_Size( list1 );
src1 = ( int * ) malloc( N * sizeof( int ) );
for( j = 0; j < N; j++ )
{
src1[j] = (int)PyInt_AsLong( PyList_GetItem( list1, j ) );
}
list2 = PyTuple_GetItem( args, 1 );
N = PyList_Size( list2 );
src2 = ( int * ) malloc( N * sizeof( int ) );
for( j = 0; j < N; j++ )
{
src2[j] = (int)PyInt_AsLong( PyList_GetItem( list2, j ) );
}
PyObject * tuple;
tuple = PyTuple_New( N );
for( j = 0; j < N; j++ )
{
PyTuple_SetItem( tuple, j, PyInt_FromLong( (long)( src1[j] +
src2[j] ) ) );
}
free( src1 );
free( src2 );
return tuple;
}
Do I have to free the memory occupied by the python objects list1 and
list2? Do I have to do any refcounting for list1, list2, tuple?
Any comment on the above code will be very appreciated! If I'm pushed
in the right direction I'm a fast learner but the beginning steps are
always hard :)
Cheers,
Daniel
--
Psss, psss, put it down! - http://www.cafepress.com/putitdown
More information about the Python-list
mailing list