如何在Python中調用C++的函數?DTW-創(chuàng)新互聯

一、問題

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

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

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

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);
};

源文件里實現:

//源文件 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;


    //填充數據
    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()函數時候總會莫名其妙報錯
            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申請的內存,一定要釋放掉。內存泄漏以前我都不管,因為函數執(zhí)行次數不多,程序結束也就自動釋放了。但這次由于 dtw 函數在 python 里執(zhí)行了幾十萬次,瞬間內存就爆了。

3、Python 寫法

首先導入ctypes 庫:

from ctypes import *

然后導入dll庫:

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

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

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

因此傳入參數是[double* , int , double* ,int],傳出參數是[double]
設定傳入傳出參數類型:

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í)行函數:

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

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

本文標題:如何在Python中調用C++的函數?DTW-創(chuàng)新互聯
標題URL:http://m.kartarina.com/article24/dcjhce.html

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

廣告

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

成都網站建設
主站蜘蛛池模板: 亚洲AV无码码潮喷在线观看 | 一级片无码中文字幕乱伦| 亚洲精品无码乱码成人| 亚洲中文字幕无码久久| 精品人妻系列无码人妻免费视频| 中文字幕无码人妻AAA片| 亚洲精品GV天堂无码男同| 少妇无码太爽了不卡在线观看| 亚洲av无码成h人动漫无遮挡| 国产成人无码A区在线观看导航| 午夜无码A级毛片免费视频| 无码日韩人妻AV一区免费l | 亚洲av无码专区在线| 亚洲午夜AV无码专区在线播放| 久久久无码精品亚洲日韩京东传媒 | 亚洲中文字幕无码久久精品1| 69天堂人成无码麻豆免费视频| 中文有无人妻vs无码人妻激烈| 天堂无码在线观看| 日韩精品中文字幕无码专区| 永久免费av无码网站韩国毛片| 亚洲av永久无码精品古装片 | 国产精品无码专区在线观看| 亚洲中文字幕无码久久| 亚洲成av人片不卡无码| 亚洲AV无码成人精品区天堂| 国产AⅤ无码专区亚洲AV| 亚洲中文字幕无码专区| 一本大道久久东京热无码AV| 在线观看无码的免费网站| 九九无码人妻一区二区三区| 日韩av无码国产精品| 免费无码又爽又刺激高潮的视频| 无码日韩精品一区二区免费| 日韩精品无码区免费专区| 国产做无码视频在线观看| 无码日韩人妻AV一区二区三区 | 国产精品无码永久免费888| 国产精品无码素人福利不卡| 国产AV一区二区三区无码野战| 亚洲精品无码MV在线观看|