如何处理C ++返回类型std :: vector 在Python ctypes?

发布于 2021-01-29 18:25:06

我找不到ctypes如何弥合std::vectorPython和Python之间的鸿沟。没有提到互联网上的任何地方。这是不好的做法吗,不存在还是我错过了什么?

C ++ :xxx.cpp

#include <fstream>
#include <string>
using namespace std;
extern "C" std::vector<int> foo(const char* FILE_NAME)
{
    string line;
    std::vector<int> result;
    ifstream myfile(FILE_NAME);
    while (getline(myfile, line)) {
      result.push_back(1);
    }

    return(result);
}

的Python: xxx.py

import ctypes
xxx = ctypes.CDLL("./libxxx.so")
xxx.foo.argtypes = ??????
xxx.foo.restype = ??????
关注者
0
被浏览
177
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    特殊原因是速度很重要。我正在创建一个应该能够处理大数据的应用程序。在200,000行中,必须按300个值(200k x
    300矩阵)计算缺失。我相信,但是如果我错了,请纠正我,C ++的速度将大大提高。

    好吧,如果您正在读取一个大文件,则您的进程将主要受IO限制,因此Python和C之间的时间安排可能不会有很大不同。

    以下代码…

    result = []
    for line in open('test.txt'):
        result.append(line.count('NA'))
    

    …似乎可以像我在C中可以一起破解的任何东西一样快地运行,尽管它使用的是我不太熟悉的优化算法

    处理200,000行只需不到一秒钟的时间,尽管我很想知道您是否可以编写一个速度明显更快的C函数。


    更新资料

    如果您想用C语言编写并以Python列表结尾,那么使用Python / C
    API
    自己构建列表可能会更有效,而不是std::vector稍后再构建然后转换为Python列表。

    一个示例,它仅返回一个从0到99的整数列表…

    // hack.c
    
    #include <python2.7/Python.h>
    
    PyObject* foo(const char* filename)
    {
        PyObject* result = PyList_New(0);
        int i;
    
        for (i = 0; i < 100; ++i)
        {
            PyList_Append(result, PyInt_FromLong(i));
        }
    
        return result;
    }
    

    编译…

    $ gcc -c hack.c -fPIC
    $ ld -o hack.so -shared hack.o -lpython2.7
    

    用法示例…

    >>> from ctypes import *
    >>> dll = CDLL('./hack.so')
    >>> dll.foo.restype = py_object
    >>> dll.foo('foo')
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看