Python PYPY Cffi с массивом Numpy

Я пытаюсь научиться использовать cffi, но я новичок в c, так что это немного сложно. Я практикуюсь с простой функцией для вычисления суммы массива двойников. Как ни странно, моя функция суммы не дает правильного результата. Кто-нибудь может понять, почему? Правильно ли я обрабатываю массив? Я не понимаю, почему я должен использовать массивы numpy в качестве указателей.

from cffi import FFI
import numpy as np

ffi = FFI()
ffi.cdef("""
double sum(double[], int);
""")
C = ffi.verify("""
double sum(double numbers[],int num_elements){
   int i, sum=0.0;
   for (i=0; i<num_elements; i++)
   {
     sum = sum + numbers[i];
   }
   return(sum);
}
""")
numbers = np.random.gamma(1,1,100)
print 'numpy', sum(numbers)

numbers_p = ffi.cast('double *',numbers.ctypes.data)
sm = C.sum(numbers_p, len(numbers))

print 'cffi', sm

выход:

numpy 119.436940423
cffi 80.0

person Tim    schedule 08.04.2014    source источник


Ответы (1)


Обратите внимание, что в результате получается красивое плоское целое число.

Ваш код C неверен. Вам нужно указать правильный тип для суммы.

Предлагаемые изменения:

C = ffi.verify("""
double sum(double numbers[],int num_elements){
   int i;
   double sum=0.0; //Now it has the correct data type.
   for (i=0; i<num_elements; i++)
   {
     sum = sum + numbers[i];
   }
   return(sum);
}
""")

С этой поправкой:

>>> sm = C.sum(numbers_p, len(numbers))
>>> sm
98.53688973595715
>>> sum(numbers)
98.536889735957146
>>> sum(numbers) == sm
True
person Autumn    schedule 08.04.2014