Cython 让Python变得更快

举报
jackwangcumt 发表于 2021/11/28 11:29:56 2021/11/28
【摘要】 Cython主要特性是支持可选的静态类型声明,这样可以将Python源码解析为C或C++代码,并编译为Python扩展模块。这种特征可以非常方便的将Python与外部C库的进行集成和交互,同时保留Python语言的简单性。本文重点讲解Cython的安装以及如何来提高Python的代码执行效率。

1 Cython 概述


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

       注意:这里需要注意CythonCPython的区别,前者是一种编程语言,而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操作系统上下载的是一个压缩包,解压后即可使用,可以通过浏览器进行下载,我这里的具体界面如下所示:

0.jpg

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

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解析器环境,这里需要根据实际情况进行设置。界面如下所示:

1.jpg
至此,我们的开发环境就基本构建完成了。这里可以创建一个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

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

2.jpg
   为了对比性能,再添加一个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编译过的代码执行效率会高一些。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200