1. 程式人生 > >python基礎教程(第三版)學習筆記(十七)

python基礎教程(第三版)學習筆記(十七)

第十七章 擴充套件Python

這門語言功能強大,但有時候速度有點慢。 Python的目標是易於使用以及幫助提高開發速度,這種靈活 性是以犧牲效率為代價的。 但如果你真的很 在乎速度,C、C++、Java和Julia等語言通常要快好幾個數量級。

17.1 魚和熊掌兼得

本章討論確實需要進一步提升速度的情形。在這種情況下,最佳的解決方案可能不是完全轉 向C語言(或其他中低階語言),採用下面的方法(這可滿足眾多的速度至上需求)。 (1) 使用Python開發原型。 (2) 對程式進行效能分析以找出瓶頸(有關測試,請參閱第16章)。 (3) 使用C(或者C++、java等)擴充套件重寫瓶頸部分 。

在接下來的幾節中,將簡要地介紹如何擴充套件Python的經典C語言實現(為此可手工編寫所 有的程式碼,也可使用工具SWIG),以及如何擴充套件其他兩種實現:Jython和IronPython。另外,還 將討論訪問外部程式碼的其他方式。

windows系統下SWIG使用(Python)示例:

PYTHON_INCLUDE:將其設定為包含Python.h的目錄.PYTHON_LIB:將此設定為python庫,包括連結路徑

使用Python 2.1.1的示例:PYTHON_INCLUDE:D:\ python21 \ include PYTHON_LIB:D:\ python21 \ libs \ python21.lib

17.2 簡單易行的方式:Jython 和 IronPython

在使用時需要注意python、jython及JDK的版本問題,(例如:Jython2.7版本JDK8以上不支援,需JDK6)要用import引入 java類,需要編輯java檔案然後javac編譯為class檔案,把該class檔案拷貝到jython所在的目錄,啟動jython,然後用jython執行import,引入class檔案。jython是一個獨立的python語言編譯檔案,只不過它同時支援java庫和python模組而已。

17.3 編寫 C 語言擴充套件

這是真正的重點所在。擴充套件Python通常意味著擴充套件CPython——使用程式語言C實現的Python 標準版。

17.3.1 SWIG

SWIG(http://www.swig.org)指的是簡單包裝器和介面生成器 。是一個適用於多種語言的工具。一方面,它讓你能夠使用C或C++編寫擴充套件程式碼;另 一方面,它自動包裝這些程式碼,讓你能夠在Tcl、Python、Perl、Ruby和Java等高階語言中使用它 們。

SWIG的安裝步驟與其他Python工具相同。可從官網http://www.swig.org下載SWIG。如果你在安裝SWIG時遇到麻煩,應該能夠在官網找到幫助資訊。

1、用法

(1) 為程式碼編寫一個介面檔案。這很像C語言標頭檔案(在比較簡單的情況下,可直接使用現有 的標頭檔案)。 (2) 對介面檔案執行SWIG,以自動生成一些額外的C語言程式碼(包裝器程式碼)。 (3) 將原來的C語言程式碼和生成的包裝器程式碼一起編譯,以生成共享庫。

2、. 迴文

迴文(palindrome;如I prefer pi)是忽略空格、標點等後正著讀和反著讀一樣的句子。

3、介面檔案

在介面檔案中,你只是宣告要匯出的函式(和變數),就像在標頭檔案中一樣。另外,在介面 檔案的開頭,有一個由%{和%}界定的部分,可在其中指定要包含的標頭檔案(這裡為string.h)。在 這個部分的前面,還有一個%module宣告,用於指定模組名。形如:

 %module palindrome %{ #include <string.h> %} extern int is_palindrome(char *text); 

4、執行SWIG

執行SWIG可能是整個過程中最容易的部分。雖然有很多命令列開關(要獲悉完整的開關列 表,可執行命令swig -help),但只需使用開關-python就可讓SWIG對C語言程式碼進行包裝,以便 能夠在Python中使用。另一個可能很有用的開關是-c++,可用於包裝C++庫。執行SWIG時,需要 將介面檔案(也可以是標頭檔案)作為引數,形如:

 swig -python palindrome.i 

這將生成兩個新檔案,分別是palindrome_wrap.c和palindrome.py 。

5、編譯、連結和使用

編譯可能是最棘手的部分。要正確地編譯,需要知道Python原始碼(至 少是標頭檔案pyconfig.h和Python.h)的儲存位置(它們可能分別位於Python安裝目錄和子目錄 Include中)。你還需根據選擇的C語言編譯器,使用正確的開關將程式碼編譯成共享庫。具體操作可參見 PJ-Javis的blog:《Swig:C/C++程式碼轉Python》地址:https://blog.csdn.net/jiangpeng59/article/details/73554835

 

(涉及問題太多,暫時沒時間除錯,現記錄在此。先看下回分解吧!)