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