在cython调用之间保持DataFrame的状态

时间:2017-03-21 10:16:40

标签: c++ pandas cython

我有C ++代码调用包含cythonized python函数的DLL。 python函数使用DataFrame(创建它,然后在其上执行查找/填充)。我想只创建一次DataFrame,这意味着我需要在python函数退出后保持其状态。

我还没有找到一种方法如何将数据帧指针从cython工厂返回到C ++,然后将其从C ++发送到其他cython函数。我想在cython中避免使用类似单身的解决方案。请指教。

EDIT1: foo.pyx:

cdef public string Foo( const string& csvpath ) except *:
    cdef string c_csvpath = csvpath
    #...

foo.h中:

__PYX_EXTERN_C DL_IMPORT(std::string) Foo(std::string const &);

1 个答案:

答案 0 :(得分:0)

我将假设您要保留string返回类型(如果没有,那么您只需返回一个Python对象,您可能会发现它更容易)。如果是这种情况,那么您需要使用其中一个函数参数来存储数据。原则上可以使用任何可变的Python对象,但我会用字典演示,因为我认为这是最有意义的:

cdef public string Foo( const string& csvpath, dict saved_data ) except *:
    cdef string c_csvpath = csvpath

    # get the DataFrame if possible, otherwise generate it
    try:
        df = saved_data['dataframe']
    except KeyError:
        df = 3.3 # somehow generate your dataframe


    # at the end make sure everything's updated
    saved_data['dataframe'] = df
    return csvpath

C签名变为:

__PYX_EXTERN_C DL_IMPORT(std::string) Foo(std::string const &, PyObject *);

在C ++代码中,您需要创建并保存字典:

PyObject* data = PyDict_New();
// good code would check for null here

string out = Foo(string("Hi"),data);

// your data dictionary should now have "dataframe" in it

// a second call, reusing the data frame
string out2 = Foo(string("Hi"),data);

// once you're sure you've done with the data frame
Py_DECREF(data); // frees it, unless Python also has a copy