在 python 中執(zhí) DTW 算法,但是太慢,想到了用c++寫該算法,再用python執(zhí)行
先貼一張效果圖,可以看出,同樣一份 dtw 代碼,python 和 C++ 有10倍多的差距。
有很多種方法可以在python里執(zhí)行c++代碼,這里選一個(gè)我覺得最簡單的。推薦使用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);
};
源文件里實(shí)現(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ù)時(shí)候總會(huì)莫名其妙報(bào)錯(cuò)
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里用。
注意:
對(duì)于malloc申請(qǐng)的內(nèi)存,一定要釋放掉。內(nèi)存泄漏以前我都不管,因?yàn)楹瘮?shù)執(zhí)行次數(shù)不多,程序結(jié)束也就自動(dòng)釋放了。但這次由于 dtw 函數(shù)在 python 里執(zhí)行了幾十萬次,瞬間內(nèi)存就爆了。
首先導(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海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧