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

(涉及问题太多,暂时没时间调试,现记录在此。先看下回分解吧!)

猜你喜欢

转载自blog.csdn.net/micorjun/article/details/84325075