当前位置: 首页 > 面试题库 >

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

魏健柏
2023-03-14
问题内容

我找不到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 = ??????

问题答案:

特殊原因是速度很重要。我正在创建一个应该能够处理大数据的应用程序。在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, ...]


 类似资料:
  • 下面的代码显示了我要做的:

  • 为了概括这个问题,我借用了Zelenski CS课堂讲义中的材料。而且,这与我的具体问题有关,因为几年前我从另一位讲师那里学习了C语言的这种方法。讲义在这里。我对C的理解很低,因为我偶尔使用它。基本上,我需要编写一个程序的几次,我回到课堂材料,找到类似的东西,然后从那里开始。 在本例(第4页)中,Julie正在字符串函数中使用递归算法查找单词。为了减少递归调用的数量,她添加了一个决策点。 为了增加

  • 如何确定像std::count_if这样的std::函数的类型?理想情况下,我想要以下内容 但由于多种原因,这并不奏效。我可以通过: 但这仍然是不够的。 错误:

  • 如果我们有 我们将插入 方法1:我们可以做: 方法二,我们不能这样做? 这个错误意味着什么? 错误C2664:“标准::_Vector_iterator,标准::equal_to 如果我们需要将作为全局来处理,解决方案是什么?

  • 我有一个Spring3.2MVC REST服务,它通过扩展来实现错误处理。这将处理标准的Spring异常,并根据客户机的请求使用适当的HTTP状态和XML或JSON中的自定义“Error”ResponseEntity对象进行响应。除了之外,这对所有标准异常都非常有效。 这个异常的问题在于,首先抛出它的原因是因为无法从请求中确定响应媒体类型(application/xml、application/j

  • 前几天我问了一个关于嵌套向量的非常类似的问题,但我遇到了另一个让我难堪的问题。我需要在编译时获取嵌套向量的最内层类型,以便将其作为模板参数传递。 例如,如果我有这个嵌套向量: 我需要一种方法来提取,这样我就可以调用一个函数,它需要一个嵌套的向量,并对这样的元素工作: 除了catch之外,这个函数应该能够处理包含任何类型的任何深度的嵌套向量。当我调用时,我希望自动为我推导出内部类型。 所以也许电话看