python 编译软件_python高性能编程之Cython篇 第二章

编译和运行Cython代码

Python和C或C ++之间的一个更重要的区别是Python在C和C ++编译时被解释。在开发Python程序时,我们可以在进行修改后立即运行代码,而C和C ++需要进行预编译步骤。编译大型C或C ++代码库可能需要数小时或数天。使用Python可以实现更快速的开发,从而显着提高生产力。与C和C ++一样,Cython需要一个编译步骤才能运行源代码。这个编译步骤可以是显式的或隐式的。两种模式都有其用途。自动编译Cython的一个很好的功能是它使得使用Cython感觉就像使用纯Python一样。因为Cython可以有选择地应用于Python代码库的小部分,可以最小化Cython的编译要求。

本章将介绍编译Cython代码的各种方法,以便它可以由Python运行。有几种选择:

•可以从IPython解释器以交互方式编译和运行Cython代码。

•可以在导入时自动编译。

•它可以通过Python的distutils等构建工具单独编译。

•它可以集成到标准构建系统中,例如make,CMake或SCons。

这些选项允许我们将Cython适应不同的应用场景,从一端的快速交互式探索到另一端的构建。另一种方法将Cython代码传递到两个编译阶段,以生成Python可以导入和使用的编译模块(sklearn中我记得是有用这种方式来实现算法的)。 在我们介绍每种编译方法的细节之前,了解下面的内容是很有帮助的。

Cython编译通道

因为Cython语言是Python的超集,所以Python解释器无法直接导入和运行它。 那么我们如何从Cython源到有效的Python呢? 答案是通过Cython编译通道。通道的工作是将Cython代码转换为Python扩展模块,可以由Python解释器导入和使用。 这个通道可以自动运行,无需用户参与(使Cython感觉像Python一样),或者在需要更多控制时由最终用户明确地运行。

(补充

Cython有一个纯Python模式,允许用户引入特定于Cython的声明,其方式仍然是有效的Python语法。 在纯Python模式下开发的代码更加冗长,但可以由Python解释器直接运行(没有Cython速度改进)或由Cython编译。 我们在这里不涉及纯Python模式,将其处理留在在线文档中。)

编译通道包括两个阶段。 第一阶段由cython编译器处理,cython编译器将Cython源代码转换为经过优化且与平台无关的C或C ++。第二阶段将生成的C或C ++源代码编译为带有标准C或C ++编译器的共享库。 生成的共享库依赖于平台。 它是一个在Linux或Mac OS X上具有.so扩展名的共享对象文件,是一个在Windows上具有.pyd扩展名的动态库。 传递给C或C ++编译器的标志确保此共享库是一个成熟的Python模块。 我们将此编译模块称为扩展模块,并且可以将其导入和使用,就好像它是用纯Python编写的一样。 几乎所有这些阶段的复杂性都由我们将在本章其余部分描述的工具来管理。 我们很少考虑编译管道运行时发生了什么,但是在我们浏览以下部分时,最好记住这些阶段。

(补充: cython编译器是源到源编译器,生成的代码经过高度优化。 Cython生成的C代码比典型的手写C语言更快的情况并不少见。当作者给学生教授Cython时,学生经常将C语言编写为Cython代码; Cython版本几乎总是更快,通过Cython“生成C代码也非常便携,支持所有常见的C编译器和许多不同的Python版本“)

安装和测试我们的设置

现在我们已经了解了编译通道中的两个阶段,我们需要确保我们同时安装了C(或C ++)编译器和cython编译器。不同的平台有不同的选择。

C和C ++编译器(具体安装教程书上没写自己百度就i行)

Linux

有关如何安装的信息,请参阅发行版软件包管理器的文档(例如,基于RedHat的发行版的yum,基于Debian的apt-get等)

GCC和Python开发包(通常称为python-dev,或者某些变体)来获取Python头。

Mac OS X.

通过Xcode安装免费的OS X开发人员工具;这提供了类似GCC的编译器。

windows

在Windows上使用的推荐编译器是Visual Studio,与用于编译Python运行时的版本相同。如果这不可用,那么一个替代方案是Microsoft提供的用于编译Python 2.7扩展的最小Visual C ++编译器。另一个不错的选择是使用Windows SDK C / C ++编译器。这些编译器是编译64位扩展的唯一可靠选项。

Windows上用于32位扩展的另一个选项是使用MinGW。它不像Microsoft提供的编译器那样可靠,但可能适用于简单的示例。 MinGW编译器通过几个预先打包的Python软件发行版进行分发,在下一节中提到。

安装Cython

获得Cython的最简单方法可能是通过一个打包的软件分发,例如这些流行的选项:

•Sage数学软件系统

•Enthought的Canopy •来自Continuum Analytics的Anaconda •GPL许可和以Windows为中心的Python(x,y) 由于预先打包,这些选项可能会落后于最新版Cython的一两个版本。 要使用最新版本的Cython,我们可以从源代码安装。这需要一个有效的C或C ++编译器;有关详细信息,请参阅上一节。可能从源代码安装的最简单方法是通过pip,这通常是通过列出的软件包发行版提供的,现在通过Python(版本3.4)本身分发: $ pip install cython 另一个选择是下载Cython源代码。从Cython源目录中,运行: $ python setup.py安装 安装后 - 无论是通过软件分发还是手工编译 - cython编译器都可以从命令行获得: $ cython -V Cython版本0.20.2 一旦我们有了C编译器和cython编译器,我们就可以按照本章中的distutils和pyximport部分进行操作了。另外,我们需要安装IPython以在IPython中使用Cython。打包的发行版包括IPython,或者我们可以使用pip来安装它。

标准方式:使用distutils和cythonize

Python的标准库包含用于构建,打包和分发Python项目的distutils包。 distutils包具有许多功能;我们感兴趣的是它能够将C源编译成扩展模块,这是编译通道中的第二个阶段。它为我们管理所有平台,体系结构和Python版本的详细信息,因此我们可以使用一个distutils脚本并在任何地方运行它来生成我们的扩展模块。

第一个管道阶段怎么样?这是cythonize命令的工作,它包含在Cython中:它接受一个Cython源文件(以及任何其他必要的选项)并将其编译为C或C ++源文件,然后distutils从那里获取它。

通过使用Python的distutils模块结合Cython的cythonize命令,我们可以明确控制编译通道。这种方法要求我们编写一个小的Python脚本并明确地运行它。这是Python项目最常用的方式来编译和分发他们的Cython代码给最终用户。

我们的distutils脚本

例如,考虑第1章中的fib.pyx Cython源代码。我们的目标是使用distutils在Mac或linux上构建fib.so文件或则和是Windows上的fib.pyd文件。

我们通过Python脚本控制distutils的行为,通常名为setup.py。

用于将fib.pyx源文件编译为扩展模块的最小setup.py脚本只需几行,代码如下:

def fib(int n):
    cdef int i
    cdef double a=0.0, b=1.0
    for i in range(n):
        a, b = a + b, a
    return a

我们将上述代码保存为当前目录下的fib.pyx文件

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize('fib.pyx'))

我们将上述代码保存为当前目录下的setup.py文件

打开cmd,我们切换到当前文件夹,执行python setup.py build_ext --inplace

440c014e1edde7506cd1d16a096d3a3b.png

可以看到当前文件夹下多了一个fib.c文件,一个fib.cpbalabal.pyd和build文件夹。第二个文件就是我们可以直接import进来的pyd文件。为了能够使当前目录下的文件随地导入我们新建一个_init_.py文件然后from fib import * 就可以了

python setup.py build_ext --inplace

测试一下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值