如何在Python中調(diào)用C++的函數(shù)?DTW-創(chuàng)新互聯(lián)

一、問題

在 python 中執(zhí) DTW 算法,但是太慢,想到了用c++寫該算法,再用python執(zhí)行
先貼一張效果圖,可以看出,同樣一份 dtw 代碼,python 和 C++ 有10倍多的差距。
在這里插入圖片描述

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),蕪湖縣企業(yè)網(wǎng)站建設(shè),蕪湖縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,蕪湖縣網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,蕪湖縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。二、C++ 寫法

有很多種方法可以在python里執(zhí)行c++代碼,這里選一個我覺得最簡單的。推薦使用vs,編譯如下代碼,注意選擇生成dll,而不是exe。
我的函數(shù)原型是 :

double dtw(double* x, int x_size, double* y, int y_size)

頭文件里需要聲明:

//頭文件 main.h
#pragma once
#includeextern "C"
{__declspec(dllexport) double __cdecl dtw(double* x, int x_size, double* y, int y_size);
};

源文件里實現(xiàn):

//源文件 main.cpp
#include "main.h"
#includedouble dtw(double* x, int x_size, double* y, int y_size)
{double** D0 = (double**)malloc(sizeof(double*) * (x_size + 1));
    for (int i = 0; i< x_size + 1; i++)
        D0[i] = (double*)malloc(sizeof(double) * (y_size + 1));

    //填充邊框
    D0[0][0] = 0;
    for (int i = 1; i< x_size + 1; i++) D0[i][0] = INT_MAX;
    for (int i = 1; i< y_size + 1; i++) D0[0][i] = INT_MAX;


    //填充數(shù)據(jù)
    for (int i = 1; i< x_size + 1; i++)
    {for (int j = 1; j< y_size + 1; j++)
        {D0[i][j] = abs(x[i - 1] - y[j - 1]);
        }
    }

    for (int i = 1; i< x_size + 1; i++)
    {for (int j = 1; j< y_size + 1; j++)
        {	//使用min()函數(shù)時候總會莫名其妙報錯
            double temp = D0[i - 1][j]< D0[i][j - 1] ? D0[i - 1][j] : D0[i][j - 1];
            double t = temp< D0[i - 1][j - 1] ? temp : D0[i - 1][j - 1];
            D0[i][j] += t;
        }
    }
    double d = D0[x_size][y_size];
    for (int ii = 0; ii< x_size + 1; ii++)
    {free(D0[ii]); //一定要釋放!
    }
    free(D0);
    return d;
}

在vs中編譯生成dll庫后,拿去python里用。

注意:
對于malloc申請的內(nèi)存,一定要釋放掉。內(nèi)存泄漏以前我都不管,因為函數(shù)執(zhí)行次數(shù)不多,程序結(jié)束也就自動釋放了。但這次由于 dtw 函數(shù)在 python 里執(zhí)行了幾十萬次,瞬間內(nèi)存就爆了。

3、Python 寫法

首先導(dǎo)入ctypes 庫:

from ctypes import *

然后導(dǎo)入dll庫:

dll = CDLL("./DTW_DLL.dll")
dtwc = dll.dtw #dtw名稱需要與c++中函數(shù)名稱一致

Python寫法中需要注意的,就是傳入和傳出參數(shù)的類型,我的C++函數(shù)原型是

double dtw(double* x, int x_size, double* y, int y_size)

因此傳入?yún)?shù)是[double* , int , double* ,int],傳出參數(shù)是[double]
設(shè)定傳入傳出參數(shù)類型:

dtwc.argtypes = [np.ctypeslib.ndpointer(dtype=np.float64,ndim=1),c_int,
                    np.ctypeslib.ndpointer(dtype=np.float64,ndim=1),c_int]
dtwc.restype = c_double

最后執(zhí)行函數(shù):

d = dtwc(x,20,y,20)

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

本文標(biāo)題:如何在Python中調(diào)用C++的函數(shù)?DTW-創(chuàng)新互聯(lián)
標(biāo)題URL:http://muchs.cn/article24/dcjhce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、搜索引擎優(yōu)化網(wǎng)站營銷、品牌網(wǎng)站設(shè)計域名注冊、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)