我正在为我的Python程序编写一个C扩展用于速度目的,并且遇到一些非常奇怪的行为,试图传入一个三维的numpy数组.它适用于一个二维数组,但我确定我正在搞砸一些指针试图让它与第三维一起工作.但这是奇怪的部分.如果我只是传入一个三维数组,它会因总线错误而崩溃.如果(在Python中)我首先将我的变量创建为2D数组,然后用3D数组覆盖它,它可以完美地工作.如果变量首先是空数组,然后是3D数组,则会发生Seg Fault故障.怎么可能发生这种情况?
此外,任何人都可以帮助我获得3D阵列吗?或者我应该放弃并传递2D数组并自行重塑它?
这是我的C代码:
static PyObject* func(PyObject* self, PyObject* args) {
PyObject *list2_obj;
PyObject *list3_obj;
if (!PyArg_ParseTuple(args, "OO", &list2_obj, &list3_obj))
return NULL;
double **list2;
double ***list3;
//Create C arrays from numpy objects:
int typenum = NPY_DOUBLE;
PyArray_Descr *descr;
descr = PyArray_DescrFromType(typenum);
npy_intp dims[3];
if (PyArray_AsCArray(&list2_obj, (void **)&list2, dims, 2, descr) < 0 || PyArray_AsCArray(&list3_obj, (void ***)&list3, dims, 3, descr) < 0) {
PyErr_SetString(PyExc_TypeError, "error converting to c array");
return NULL;
}
printf("2D: %f, 3D: …Run Code Online (Sandbox Code Playgroud) 我正在测试几种不同方式的速度来对我的一些数据进行复杂的迭代,我发现了一些奇怪的东西.似乎某个函数的局部大型列表会大大减慢该函数的速度,即使它没有触及该列表.例如,通过相同生成器函数的2个实例创建2个独立列表,第二次约慢2.5倍.如果在创建第二个列表之前删除了第一个列表,则两个迭代器都会使用相同的spee.
def f():
l1, l2 = [], []
for c1, c2 in generatorFxn():
l1.append((c1, c2))
# destroying l1 here fixes the problem
for c3, c4 in generatorFxn():
l2.append((c3, c4))
Run Code Online (Sandbox Code Playgroud)
这些列表每个最终大约有310万个项目,但我也看到了与较小列表相同的效果.第一个for循环运行大约需要4.5秒,第二个循环需要10.5秒.如果我插入l1= []或l1= len(l1)在注释位置,两个for循环都需要4.5秒.
为什么函数中本地内存分配的速度与该函数变量的当前大小有关?
编辑:禁用垃圾收集器修复一切,所以必须由于它不断运行.案件结案!