【发布时间】:2014-05-03 09:19:13
【问题描述】:
我正在编写一个模块以优化操作,但我有几个问题。
第一
我需要从 python 读取一个数组(列表列表)到 C,我是这样做的:
long i_k;
for (int k = 0; k < n; k++) {
PyObject *first = PyList_GetItem(streamMatrixObj, k);
for (int i = 0; i < n; i++) {
PyObject *second = PyList_GetItem(first, i);
i_k = PyLong_AsLong(second);
f[k][i] = i_k;
}
}
矩阵总是n x n。有没有更好的方法来读取列表列表并将其存储到 C 数组中?
第二
我正在为 C 数组分配内存,如下所示:
void **createMatrix(uint rows, uint cols) {
long **matrix;
const size_t row_pointers_bytes = rows * sizeof(*matrix);
const size_t row_elements_bytes = cols * sizeof(**matrix);
matrix = PyObject_Malloc(row_pointers_bytes + rows * row_elements_bytes);
if (!matrix) {
PyErr_NoMemory();
return NULL;
}
size_t i = 0;
long *data = matrix + rows;
for (i = 0; i < rows; i++)
matrix[i] = data + i * cols;
return matrix;
}
我应该使用PyMem_Malloc还是PyObject_Malloc?,我在这个问题中看到了解释
Is there any reason to use malloc over PyMem_Malloc?
但还是不知道该调用什么函数。
第三
这个模块的方法会被多次调用,所以我想把C数组保存在内存中,以免每次都重新创建数组。例如,在 python 中,我会调用方法myModule.deltaC(1,2,[1,2,3]),该调用将对矩阵进行一些操作。
我可以在使用deltaC 函数之前初始化数组,例如myModule.initMatrix([[1,2,3],[1,2,3], [1,2,3]]),并将其保存在内存中直到程序完成?那么C数组需要成为模块中的全局变量吗?
更新
我尝试使用 module.initMatrix 在全局变量中初始化 C 数组,但是当调用 module.delta 时,我在访问 C 数组时遇到了 SegFault,所以我想这是不可能的,或者我错过了东西。
第四个
有没有办法检测 python 程序何时完成以调用PyObject_free(array) 以释放为 C 数组分配的内存?
【问题讨论】:
标签: python c arrays memory-management python-c-api