Cython中动态调整大小的对象数组

时间:2018-06-24 01:19:22

标签: python c++ 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;

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

2 个答案:

答案 0 :(得分:3)

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

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

template <typename T>
void array_delete(T* x) {
    delete [] x;
}

从以下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)

鉴于Cython对C ++的支持是有限的,并且在某些地方很尴尬(并且考虑到无论如何都要使用C ++),我认为编写少量C ++代码通常是一个合理的解决方案,并可以节省很多时间。某些人似乎想不惜一切代价避免这种情况。...


我仍然建议您使用向量向量(vector<vector<double>>),因为您可以免费获得内存管理。最好还是坚持使用Python类型并使用numpy数组列表,但是如果要与外部C ++代码进行接口,那可能不合适。

答案 1 :(得分:3)

作为@DavidW答案的补充:自Cython 0.28起,有一个允许verbatim C-code的新功能。它的优点是可以无缝使用这种小型C / C ++包装器:

cdef extern from *:
    """
    template <typename T>
    T* array_new(int n) {
        return new T[n];
    }

    template <typename T>
    void array_delete(T* x) {
        delete [] x;
    }
    """
    T* array_new[T](int)
    void array_delete[T](T* x)

from libcpp.vector cimport vector
.... and so on

无需创建外部头文件。