【问题标题】:Python PYPY Cffi with Numpy array带有 Numpy 数组的 Python PYPY Cffi
【发布时间】:2014-05-21 19:29:14
【问题描述】:

我正在尝试学习使用 cffi,但我对 c 还很陌生,所以它有点棘手。我正在练习一个简单的函数来计算双精度数组的总和。奇怪的是,我的 sum 函数没有给出正确的输出。谁能明白为什么?我是否正确处理数组?我不明白为什么我必须将 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

【问题讨论】:

    标签: python arrays numpy pypy python-cffi


    【解决方案1】:

    注意结果是一个漂亮的扁平整数。

    你的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 2015-12-12
      • 2020-08-09
      • 2021-06-18
      • 2019-07-03
      • 2016-07-02
      • 2020-05-04
      相关资源
      最近更新 更多