摘要:所以,最大的好處就是將腳本語言的開發(fā)效率和的運(yùn)行效率有機(jī)的結(jié)合起來。前面的文章提到一個實(shí)現(xiàn)的雙數(shù)組的實(shí)現(xiàn),它在中文分詞新詞發(fā)現(xiàn)等算法中的應(yīng)用。本文以的封裝實(shí)現(xiàn)來說明的使用。編譯生成動態(tài)庫編譯生成的使用的,可以參考的編寫。
如果覺得文章對你有幫助,你也可以訪問老猿的個人博客https://www.yuanrenxue.com/
Python調(diào)用C/C++代碼的利器除了boost_python外,還有SWIG(Simplified Wrapper and Interface Generator),它是用來為腳本語言調(diào)用C和C++程序的軟件開發(fā)工具,它實(shí)際上是一個編譯器,獲取C/C++的聲明和定義,用一個殼封裝起來,以便其它腳本語言訪問這些聲明。所以,SWIG 最大的好處就是將腳本語言的開發(fā)效率和 C/C++ 的運(yùn)行效率有機(jī)的結(jié)合起來。
前面的文章提到一個C++實(shí)現(xiàn)的雙數(shù)組Trie Tree的實(shí)現(xiàn):cedar,它在中文分詞、新詞發(fā)現(xiàn)等算法中的應(yīng)用。本文以cedar的SWIG封裝實(shí)現(xiàn)來說明SWIG的使用。
0. 安裝swig
工欲善其事必先利其器,首先要安裝swig,Ubuntu安裝swig很簡單:
sudo aptitude install swig
1. 聲明和定義C/C++代碼
在cedar的swig目錄下面有cedar的C++聲明和實(shí)現(xiàn)代碼trie.h,但是這個實(shí)現(xiàn)里面沒有遍歷所有key的函數(shù)方法,所以我添加了一個實(shí)現(xiàn),首先定義一個數(shù)據(jù)結(jié)構(gòu)來定義key:
// key-value pair return type for next_key() class kv_t { public: std::string key; int value; };
添加一個函數(shù)每次返回一個key,當(dāng)key字符串為空時表示遍歷結(jié)束,繼續(xù)調(diào)用的話就又從頭開始遍歷:
// to iterate all keys kv_t next_key() const { static size_t from = 0, p = 0; union { int i; int x; } b; char key[256] = {0}; kv_t kv; if(from == 0) { b.i = _t->begin(from, p); }else{ b.i = _t->next(from, p); } if (b.i == trie_t::CEDAR_NO_PATH) { kv.key = ""; kv.value = 0; from = 0; p = 0; return kv; } _t->suffix(key, p, from); kv.key = key; kv.value = b.x; return kv; }
2. 編寫接口文件.i
查看cedar.i可以看到SWIG的接口文件的編寫規(guī)則:
首先在 %module 后面聲明模塊名稱,這就是Python在import時使用的模塊名稱;
在%{ … %}之間包含相關(guān)頭文件
在%include 后面可以聲明對STL的支持
最后聲明要封裝的函數(shù)和變量,也可以之間包含頭文件: %include “trie.h”
3. 封裝代碼
可以在Makefile里面看到python-bindings:
python-bindings: swig -Wall -python -builtin -outdir python -c++ cedar.i mv -f cedar_wrap.cxx python
直接make或者多帶帶運(yùn)行上面的swig命令,就可以生成cedar.py和cedar_wrap.cxx文件。
4. 編譯生成動態(tài)庫
編譯生成的cedar_wrap.cxx使用python distutils的setup,可以參考python/setup.py的編寫。setup.py的build如下:
python setup.py build
就會在當(dāng)前目錄下面創(chuàng)建目錄build,下面生成lib.linux-x86_64-2.7/cedar.py 和 _cedar.so
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43421.html
摘要:可以在接口文件中直接引用庫里的內(nèi)容,大大方便接口文件的編寫。使用庫里的這里先介紹方式通過創(chuàng)建出來的數(shù)組是數(shù)組的直接代理,非常底層和高效,但是,它也和數(shù)組一樣不安全,一樣沒有邊界檢查。對由于這種情況,可以使用庫里的。 如果你也像我們一樣,同時使用Python和C++,以獲得兩種語言的優(yōu)勢,一定也會希望尋找一種好的方式集成這兩種語言,相比而言,讓Python能夠方便使用C++的庫更加重要,...
摘要:調(diào)用方式方式一基礎(chǔ)篇這種方法叫做的擴(kuò)展使用這樣調(diào)用引用的頭文件包裹函數(shù),用來包裹需要轉(zhuǎn)化為的函數(shù),在方法前面加下劃線。定義名稱通常和文件名保持一致。執(zhí)行命令在下,使用編譯器生成對應(yīng)的文件。 Python調(diào)用C++方式 方式一(基礎(chǔ)篇) 這種方法叫做python的擴(kuò)展 int great_function(int a) { return a + 1; } 使用python這樣調(diào)用...
摘要:為了進(jìn)一步了解的邏輯,圖對和進(jìn)行了展開分析。另外,在命名空間中還隱式聲明了控制依賴操作,這在章節(jié)控制流中相關(guān)說明。簡述是高效易用的開源庫,有效支持線性代數(shù),矩陣和矢量運(yùn)算,數(shù)值分析及其相關(guān)的算法。返回其中一塊給用戶,并將該內(nèi)存塊標(biāo)識為占用。 3. TF 代碼分析初步3.1 TF總體概述為了對TF有整體描述,本章節(jié)將選取TF白皮書[1]中的示例展開說明,如圖 3 1所示是一個簡單線性模型的TF...
摘要:作為當(dāng)下最熱門的話題,等巨頭都圍繞深度學(xué)習(xí)重點(diǎn)投資了一系列新興項(xiàng)目,他們也一直在支持一些開源深度學(xué)習(xí)框架。八來自一個日本的深度學(xué)習(xí)創(chuàng)業(yè)公司,今年月發(fā)布的一個框架。 深度學(xué)習(xí)(Deep Learning)是機(jī)器學(xué)習(xí)中一種基于對數(shù)據(jù)進(jìn)行表征學(xué)習(xí)的方法,深度學(xué)習(xí)的好處是用 非 監(jiān)督式或半監(jiān)督式 的特征學(xué)習(xí)、分層特征提取高效算法來替代手工獲取特征(feature)。作為當(dāng)下最熱門的話題,Google...
閱讀 1085·2021-11-19 09:40
閱讀 2225·2021-11-15 18:00
閱讀 1274·2021-10-18 13:34
閱讀 2255·2021-09-02 15:40
閱讀 1542·2019-08-30 14:01
閱讀 1120·2019-08-30 11:11
閱讀 2487·2019-08-29 15:26
閱讀 734·2019-08-29 14:15