亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 python 列表作為 'float*' 或 'int*' 傳遞給 C/C++

將 python 列表作為 'float*' 或 'int*' 傳遞給 C/C++

冉冉說 2021-11-16 14:51:04
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]);     }}Pythonimport 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(xyz1,xyz2,n) # <-- the call to the c/c++ code我見過使用更高級的數據結構(如 C++ 的array. 但是,我只想使用基本數據類型(如int和)傳遞它float *有什么簡單的方法可以做到這一點,比如 PyBind11 或 python 的內置 C 類型?
查看完整描述

1 回答

?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

您可以使用ctypes. 首先用C Api創建一個共享對象。ctypes不支持 C++,只支持 C。這意味著你可以在你的源代碼中使用 C++,但你必須提供一個 C 接口,而沒有 C++ 語言功能,如函數重載或名稱修改。因此,函數定義用 標記extern "C"。


然后在python中加載共享對象。設置參數類型和結果類型。最后你可以調用你的函數。下面是一個例子:


import ctypes

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 = 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) 

project (DotProduct) 

set(CMAKE_CXX_STANDARD 14) 

set(CMAKE_BUILD_TYPE Debug) 


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" 


double dotProduct(double *l, double *r, unsigned int len) { 

    double sum(0); 


    while (len--) { 

        sum += l[len] * r[len]; 

    } 

    return sum; 

}

主要.py:


import ctypes


def dot_product(v1, v2):    

    l = len(v1)    

    if l != len(v2):        

        return 0    

    vec1 = (ctypes.c_double * l)(*v1)    

    vec2 = (ctypes.c_double * l)(*v2)    

    Dot_Product = ctypes.CDLL("build/lib/libDotProduct.so")      

    Dot_Product.dotProduct.argtypes = [ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double), ctypes.c_uint]    

    Dot_Product.dotProduct.restype = ctypes.c_double

    return Dot_Product.dotProduct(vec1, vec2, l)


vec1 = [2, 2]

vec2 = [2, 3]

print("{} * {} = {}".format(vec1, vec2, dot_product(vec1, vec2)))


查看完整回答
反對 回復 2021-11-16
  • 1 回答
  • 0 關注
  • 263 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號