相关疑难解决方法(0)

将Numpy数组传递给C函数以进行输入和输出

哦,我的话,我是个傻瓜. 在调用函数时,我只是省略了第二个和第三个参数.像一个傻瓜.因为那就是我.原来愚蠢的问题如下:

这似乎是一件很常见的事情,但我找不到相关的教程,而且我太无知了,Numpy并且ctypes自己弄清楚了.

我在文件中有一个C函数ctest.c.

#include <stdio.h>

void cfun(const void * indatav, int rowcount, int colcount, void * outdatav) {
    //void cfun(const double * indata, int rowcount, int colcount, double * outdata) {
    const double * indata = (double *) indatav;
    double * outdata = (double *) outdatav;
    int i;
    puts("Here we go!");
    for (i = 0; i < rowcount * colcount; ++i) {
        outdata[i] = indata[i] * 2;
    }
    puts("Done!");
}
Run Code Online (Sandbox Code Playgroud)

(正如你可能猜到的那样,我最初的论点是double*而不是void*,但是无法弄清楚在Python方面该怎么做.我当然喜欢把它们改回来,但我并不挑剔只要它有效.)

我从中创建了一个共享库.gcc -fPIC …

python ctypes numpy ffi

50
推荐指数
2
解决办法
2万
查看次数

对Python bytearray的多线程访问

看来,由于访问NumPy数组数据不需要调用Python解释器,C扩展可以在释放GIL后操作这些数组.例如,在这个帖子中.

内置的Python类型bytearray支持缓冲协议,其中一个成员是

void *buf

指向缓冲区字段描述的逻辑结构的开始的指针.[...]对于连续数组,该值指向内存块的开头.

我的问题是,在发布GIL(Py_BEGIN_ALLOW_THREADS)后,C扩展是否可以操作此buf,因为访问它不再需要调用Python C API?或者Python垃圾收集器的性质是否禁止这样做,因为在执行期间可能会移动bytearray及其buf?

python multithreading

5
推荐指数
1
解决办法
460
查看次数

标签 统计

python ×2

ctypes ×1

ffi ×1

multithreading ×1

numpy ×1