Cython 中动态大小的对象数组

par*_*iad 1 c++ python cython

如何在Cython 中执行与以下 C++ 代码等效的代码?

typedef vector<double> dvec;
dvec *arr = new dvec[n]; // n is an unsigned int (unknown at compile time)

// do something with arr; for example...
arr[0].push_back(10);
cout << arr[0][0] << endl;
Run Code Online (Sandbox Code Playgroud)

我试图为 n 个向量分配内存,但是我不知道如何在 Cython 中进行新的放置。任何帮助将不胜感激。

Dav*_*idW 5

似乎您不能new something[n]在 Cython 中执行 array new ( ) 。最简单的解决方案是创建 1 行 C++ 函数来执行数组新建和数组删除,然后调用它们。

template <typename T>
T* array_new(int n) {
    return new T[n];
}

template <typename T>
void array_delete(T* x) {
    delete [] x;
}
Run Code Online (Sandbox Code Playgroud)

从以下 Cython 文件调用

# distutils: language = c++

from libcpp.vector cimport vector

ctypedef vector[double] dvec

cdef extern from "cpp_funcs.hpp":
    T* array_new[T](int)
    void array_delete[T](T* x)

def example(int n):
    cdef dvec* arr = array_new[dvec](n)
    try:
        if n>0:
            arr[0].push_back(10)
            print(arr[0][0])
    finally:
        array_delete(arr)
Run Code Online (Sandbox Code Playgroud)

鉴于 Cython 的 C++ 支持是有限的,并且在某些地方很尴尬(并且你必须对 C++ 有很好的理解才能使用它)我认为编写少量 C++ 代码通常是一个合理的解决方案,并且可以节省相当多的时间。不过,有些人似乎想不惜一切代价避免这种情况......


我仍然建议使用向量向量 ( vector<vector<double>>) 代替,因为您可以免费获得内存管理。更好的是坚持使用 Python 类型并使用 numpy 数组列表,但如果您想与外部 C++ 代码交互,这可能不适合。