Python PYPY Cffi与Numpy数组

1 投票
1 回答
717 浏览
提问于 2025-04-18 01:55

我正在学习使用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

1 个回答

3

注意到结果是一个整齐的整数。

你的C代码有问题。你需要为sum指定正确的类型。

建议的修改:

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

撰写回答