小编Dav*_*ist的帖子

将三维numpy数组传递给C.

我正在为我的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)

c python pointers numpy python-c-extension

11
推荐指数
2
解决办法
6636
查看次数

Python函数因大型列表的存在而变慢

我正在测试几种不同方式的速度来对我的一些数据进行复杂的迭代,我发现了一些奇怪的东西.似乎某个函数的局部大型列表会大大减慢该函数的速度,即使它没有触及该列表.例如,通过相同生成器函数的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秒.

为什么函数中本地内存分配的速度与该函数变量的当前大小有关?

编辑:禁用垃圾收集器修复一切,所以必须由于它不断运行.案件结案!

python memory performance allocation

6
推荐指数
1
解决办法
2798
查看次数