猿问

将 python 列表作为 'float*' 或 'int*' 传递给 C/C++

C/C++


void func(float* xyz1, float* xyz2,int n){

     //do something

     for(int i=0; i<n;i++){

        printf("%f %f\n",xyz1[i],xyz2[i]);

     }

}

Python


import numpy as np

n = 1000000

xyz1 = np.random.random((n,)).tolist()

xyz2 = np.random.random((n,)).tolist()


#pass above array to the C/C++ code for further processing.

func(xyz1,xyz2,n) # <-- the call to the c/c++ code

我见过使用更高级的数据结构(如 C++ 的array. 但是,我只想使用基本数据类型(如int和)传递它float *


有什么简单的方法可以做到这一点,比如 PyBind11 或 python 的内置 C 类型?


冉冉说
浏览 246回答 1
1回答

有只小跳蛙

您可以使用ctypes. 首先用C Api创建一个共享对象。ctypes不支持 C++,只支持 C。这意味着你可以在你的源代码中使用 C++,但你必须提供一个 C 接口,而没有 C++ 语言功能,如函数重载或名称修改。因此,函数定义用 标记extern "C"。然后在python中加载共享对象。设置参数类型和结果类型。最后你可以调用你的函数。下面是一个例子:import ctypesimport numpy as npn = 1000000xyz1 = np.random.random((n,)).tolist()xyz2 = np.random.random((n,)).tolist()#pass above array to the C/C++ code for further processing.Func = ctypes.CDLL("path/to/libFunc.so")Func.func.argtypes = [ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double), ctypes.c_int]res = Func.func(xyz1,xyz2,n) # <-- the call to the c/c++ code我没有测试它,所以可能有一些错误,但我认为这个想法应该很清楚。这是我测试的一个例子:CMakeLists.txt:cmake_minimum_required (VERSION 3.5.1)&nbsp;project (DotProduct)&nbsp;set(CMAKE_CXX_STANDARD 14)&nbsp;set(CMAKE_BUILD_TYPE Debug)&nbsp;add_library(DotProduct SHARED src/DotProduct.cpp src/DotProduct.h)点产品.h:extern "C" double dotProduct(double* l, double* r, unsigned int len);点产品.cpp:#include "DotProduct.h"&nbsp;double dotProduct(double *l, double *r, unsigned int len) {&nbsp;&nbsp; &nbsp; double sum(0);&nbsp;&nbsp; &nbsp; while (len--) {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; sum += l[len] * r[len];&nbsp;&nbsp; &nbsp; }&nbsp;&nbsp; &nbsp; return sum;&nbsp;}主要.py:import ctypesdef dot_product(v1, v2):&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; l = len(v1)&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; if l != len(v2):&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return 0&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; vec1 = (ctypes.c_double * l)(*v1)&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; vec2 = (ctypes.c_double * l)(*v2)&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; Dot_Product = ctypes.CDLL("build/lib/libDotProduct.so")&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; Dot_Product.dotProduct.argtypes = [ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double), ctypes.c_uint]&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; Dot_Product.dotProduct.restype = ctypes.c_double&nbsp; &nbsp; return Dot_Product.dotProduct(vec1, vec2, l)vec1 = [2, 2]vec2 = [2, 3]print("{} * {} = {}".format(vec1, vec2, dot_product(vec1, vec2)))
随时随地看视频慕课网APP

相关分类

Python
我要回答