CythonPython变得更快

网友投稿 1327 2022-05-30

1 Cython 概述

根据百度百科和Cython官网(http://docs.cython.org)的文档,Cython可以看作是一种编程语言,是Python语言的一个超集,目标是构建一个高级、面向对象、函数式和动态编程语言。Cython主要特性是支持可选的静态类型声明,这样可以将Python源码解析为C或C++代码,并编译为Python扩展模块。这种特征可以非常方便的将Python与外部C库的进行集成和交互,同时保留Python语言的简单性。总之一句话,Cython可以综合Python的易用性和C语言的高效率。

注意:这里需要注意Cython和CPython的区别,前者是一种编程语言,而CPython是C语言编写的Python解析器。

2 Cython 安装

Cython的安装前置条件是需要一个C编译器,不同的操作系统需要的C编译器一般不同。下面给出不同操作系统的C编译器安装环境:

Linux操作系统:可以非常方便的安装C编译器 gcc,一般在开发环境中都自带此包,如果没有,可以通过在线安装完成。比如在Ubuntu操作系统上,可以执行sudo apt get install build sential命令获取gcc。

Mac OS X操作系统 :建议通过安装XCode工具来完成C编译器gcc的安装,或者从网站上单独下载完成安装。

Windows操作系统:需要安装Microsoft Visual C/C++(MSVC)或开源的MinGW(gcc的Windows发行版)。

关于Cython需要的C编译器环境的安装,这里不再赘述。下面以Ubuntu操作系统为例来说明如何安装Cython库。这里已经完成了Python3的基本环境搭建,可以执行如下命令:

#安装pip apt install python3-pip #升级pip pip3.6 install pip --upgrade #安装Cython pip3.6 install Cython

如果pip环境之前已经构建好,则可以直接执行 pip3.6 install Cython 即可,或者如果Python环境搭建不同,也可以执行pip3 install Cython或者pip3.7 install Cython。这里需要根据自己的实际情况来决定。

3 PyCharm安装

这里我们介绍一下如何在Ubuntu操作系统上安装Python开发工具PyCharm,这里可以下载社区版即可。Ubuntu操作系统上下载的是一个压缩包,解压后即可使用,可以通过浏览器进行下载,我这里的具体界面如下所示:

下载完成后,可以将此 pycharm-community-2021.2.3.tar.gz 压缩文件移动到需要的目录中,并切换到当前目录后,执行如下命令进行解压安装:

Cython 让Python变得更快

tar -zxvf pycharm-community-2021.2.3.tar.gz

解压后,进入目录,然后再进入bin目录,具体执行如下命令即可启动程序:

cd pycharm-community-2021.2.3 cd bin ls ################################################# brokenPlugins.db idea.properties ltedit.sh pycharm.sh format.sh inspect.sh printenv.py pycharm.svg fsnotifier libdbm64.so pycharm64.vmoptions restart.py icons.db log.xml pycharm.png ################################################# .\pycharm.sh

启动界面后,需要同意相关协议,并可以创建项目,这里需要配置Python解析器环境,这里需要根据实际情况进行设置。界面如下所示:

至此,我们的开发环境就基本构建完成了。这里可以创建一个Python项目备用。

4 Cython 编译过程

这里我们可以参考官网 http://docs.cython.org/en/latest/src/quickstart/build.html 的文档,一般来说,Cython编译过程主要由下面的2步骤构成:

(1)首先将Python源码( .py 或 .pyx 文件)通过Cython编译器翻译为 .c 文件, 此文件包含Python扩展模块( extension module)

(2)将第一步生成的 .c 文件通过C编译器(gcc)编译为 .so 文件(Linux操作系统)或 .pyd 文件(Windows操作系统)。这些 .so 文件或 .pyd 文件可以直接被 Python通过模块进行导入。

这个过程一般需要编写一个setuptools 文件 setup.py 来完成。官网给出了一个 setup.py一般结构,具体如下所示:

from setuptools import setup from Cython.Build import cythonize setup( name='Hello world app', ext_modules=cythonize("hello.pyx"), zip_safe=False, )

5 Cython Hello示例

这里参考官网 http://docs.cython.org/en/latest/src/quickstart/build.html 的文档,给出一个Cython入门的Hello示例,首先在PyCharm项目中添加一个hello.pyx文件,.pyx 文件是由 Cython 编程语言编写而成的 Python 扩展模块源代码文件,一般来说,不能直接被Python 识别,即不可导入。内容如下所示:

def my_sum(n): s = 0 for i in range(n + 1): s += i print("sum(", n, ")=>", s)

就是简单的定义了一个my_sum函数,传递一个参数n,在内部进行求和,并通过print打印。然后再添加一个安装工具setuptools 文件 setup.py,内容如下所示:

from setuptools import setup from Cython.Build import cythonize setup( name='Cython Hello Demo', ext_modules=cythonize("hello.pyx"), zip_safe=False, )

首先需要从setuptools模块中导入setup函数,同时从Cython.Build模块中导入cythonize方法,然后在setup函数中,通过 ext_modules=cythonize("hello.pyx")指定需要编译的扩展模块文件名。

然后执行如下命令进行编译:

python3.6 setup.py build_ext --inplace

执行成功后,会生成如下文件,结构如下所示:

为了对比性能,再添加一个hello03.py文件,内容如下所示:

def my_sum_02(n): s = 0 for i in range(n + 1): s += i print("my_sum_02(", n, ")=>", s)

与hello.pyx文件内容除了函数名不一致外,其他都是一样的。下面给出main.py文件内容:

import timeit if __name__ == '__main__': t1 = timeit.Timer("my_sum(1000)", "from hello import my_sum") print(t1.timeit(10000)) t2 = timeit.Timer("my_sum_02(1000)", "from hello03 import my_sum_02") print(t2.timeit(10000))

其中的timeit可以方便的进行时间统计,来评估代码的执行效率。第一个t1统计Cython编译过的hello模块中的方法my_sum执行时间,而第二个t2用来统计Python代码hello03模块的my_sum_02方法的执行时间。我这里的结果如下所示:

1.0714793549996102 +++++++++++++++++ 1.9462227089989028

由此可见,此示例中的Cython编译过的代码执行效率会高一些。

gcc Python

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:2020年前端招聘技术概览
下一篇:【UML】部署图和构件图
相关文章