我才刚刚开始使用 C,正在尝试为我的 python 做一个后端。目前我有一个繁琐的系统,它从 python 写入巨大的输入文件(至少 10^6 float )然后初始化 C(它还必须加载很多其他数据)运行 C 直到终止,接收它的输出只需使用新的输入数组重新初始化它即可。
我不确定环顾四周在概念上是否可行,但我希望能够将 C 指向一个 numpy 数组的内存地址,并像使用 C 生成的数组一样使用它。目的是让 python 初始化 C,构建它的第一个数组,运行 C 代码,直到它为下一个数组做好准备,然后由 python 生成。
这是我编写的一些虚拟代码,用于尝试让 C 读取 numpy 数组。目前 C 只是有一个段错误,我不确定是不是因为我不擅长 C,它不喜欢读取 numpy 数组或两者兼而有之。
前台.py
array_interface 来自 here .
#! /usr/bin/python
import numpy as np
import subprocess as sp
ray = np.array([x*3.14 for x in range(10)])
addr = ray.__array_interface__['data'][0]
pro = sp.Popen(['./back', hex(addr)])
print pro.communicate()[0]
print ray[:5]
quit()
返回.c
#include <stdio.h>
#include <stdlib.h>
int main(char *argv[])
{
float *addr;
int n;
float a[10];
// Hopefully making a pointer to the first float in the np.ndarray
addr = sscanf(argv[1], "%x");
n = 0;
while( n<10 )
{
// Hopefully stepping through the np.ndarray one float at a time.
a[n] = *addr;
addr++;
n++;
}
// Return the first five values to compare with python.
fprintf(stdout, '%f %f %f %f %f\n', a[0], a[1], a[2], a[3], a[4]);
return 0;
}
是否可以让 C 像这样读取 numpy 数组,或者这种方法是否存在根本性缺陷?有更好的方法吗?如果这确实有效,是否可以使用 Ctype bool,两个进程都知道其地址,以协调哪个进程正在工作,哪个正在等待?例如python 在初始化 numpy 数组时将值设置为 1 - C 正在等待卡在 while(sp_bool==1) 循环中。然后当 python 完成时,它会将值更改为 0 并执行 C,最后在完成时将值更改回 1。
最佳答案
听起来您最好的选择可能是从 python 调用 C 代码。这不仅很有可能,而且实际上 NumPy 就是这样编写的。 NumPy 主要是用 C 编写的,所以当你执行 np.add(array1, array2)
时,Python 将 array1
和 array2
传递给 NumPy 的 C 代码, C 代码为结果创建一个输出数组,添加输入数组的元素将结果放入输出数组,并返回输出数组。
我认为让您的 C 代码在 Python 中可用的最简单方法是使用 Cython 对其进行包装。这里有两个教程,希望能让您朝着正确的方向前进。 How to call existing C code from Cython和 how to use NumPy arrays in Cython .
我还应该提到,您可以使用 NumPy C API 从 C 代码访问 NumPy 数组,这对你来说可能比使用 Cython 更难,因为你是 C 的新手,但如果你选择那条路线,这是另一种方式。
关于python - C 中的 Numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20269292/