0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Cython是什么,为什么会有Cython

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-06-16 16:11 次阅读

Cython 估计很多人都听说过,它是用来对 Python 进行加速的。如果你在使用 Python 编程时,有过如下想法,那么 Cython 非常适合你。

  1. 因为某些需求导致不得不编写一些多重嵌套的循环,而这些循环如果用 C 语言来实现会快上百倍,但是不熟悉 C 或者不知道 Python 如何与 C 进行交互;
  2. 因为 Python 解释器的性能原因,如果将 CPython 解释器换成 PyPy,或者干脆换一门语言,比如 Rust,将会得到明显的性能提升,可是换不得。因为你的项目组规定只能使用 Python 语言,解释器只能是 CPython;
  3. Python 是一门动态语言,但你希望至少在数字计算方面,能够加入可选的静态类型,这样可以极大地加速运算效果。因为单纯的数字相加不太需要所谓的动态性,尤其是当你的程序中出现了大量的计算逻辑时;
  4. 对于一些计算密集型的部分,你希望能够写出一些媲美 Numpy, Scipy, Pandas 的算法
  5. 你有一些已经用 C、C++ 实现的库,你想直接在 Python 内部更好地调用它们,并且不使用 ctypes、cffi 等模块;
  6. 也许你听说过 Python 和 C 可以无缝结合,通过 C 来为 Python 编写扩展模块,将 Python 代码中性能关键的部分使用 C 进行重写,来达到提升性能的效果。但是这需要你对 Python 解释器有很深的了解,熟悉底层的 Python/C API,而这是一件非常痛苦的事情;

如果你有过上面的一些想法,那么证明你的 Python 水平是很优秀的,然而这些问题总归是要解决的,于是 Cython 便闪亮登场了。注意:Cython 并不是一个什么实验性的项目,它出现的时间已经不短了,并且在生产环境中久经考验,我们完全是有理由学习它的。

Cython 是什么?

关于 Cython,我们必须要清楚两件事:

  1. Cython 是一门编程语言,它将 C 和 C++ 的静态类型系统融合在了 Python 身上。Cython 源文件的后缀是 .pyx,它是 Python 的一个超集,语法是 Python 语法和 C 语法的混血。当然我们说它是 Python 的一个超集,因此你写纯 Python 代码也是可以的。
  2. 当我们编写完 Cython 代码时,需要先将 Cython 代码翻译成高效的 C 代码,然后再将 C 代码编译成 Python 的扩展模块。

在早期,编写 Python 扩展都是拿 C 去写,但是这对开发者有两个硬性要求:一个是熟悉 C,另一个是要熟悉解释器提供的 C API,这对开发者是一个非常大的挑战。此外,拿 C 编写代码,开发效率也非常低。而 Cython 的出现则解决了这一点,Cython 和 Python 的语法非常相似,我们只需要编写 Cython 代码,然后再由 Cython 编译器将 Cython 代码翻译成 C 代码即可。所以从这个角度上说,拿 C 写扩展和拿 Cython 写扩展是等价的。

至于如何将 Cython 代码翻译成 C 代码,则依赖于相应的编译器,这个编译器本质上就是 Python 的一个第三方模块。它就相当于是一个翻译官,既然用 C 写扩展是一件痛苦的事情,那就拿 Cython 去写,写完了再帮你翻译成 C。

因此 Cython 的强大之处就在于它将 Python 和 C 结合了起来,可以让你像写 Python 代码一样的同时还可以获得 C 的高效率。所以我们看到 Cython 相当于是高级语言 Python 和低级语言 C 之间的一个融合,因此有人也称 Cython 是 "克里奥尔编程语言"(creole programming language)。

为什么要有 Cython?

Python 和 C 语言大相径庭,为什么要将它们融合在一起呢?答案是:因为这两者并不是对立的,而是互补的。

Python 是高阶语言、动态、易于学习,并且灵活。但这些优秀的特性是需要付出代价的,因为 Python 的动态性、以及它是解释型语言,导致其运行效率比静态编译型语言慢了好几个数量级。

而 C 语言是最古老的静态编译型语言之一,并且至今也被广泛使用。从时间来算的话,其编译器已有将近半个世纪的历史,在性能上做了足够的优化,因此 C 语言是非常低级、同时又非常强大的。然而不同于 Python 的是,C 语言没有提供保护措施(没有 GC、容易内存泄露),以及使用起来很不方便。

所以两个语言都是主流语言,只是特性不同使得它们被应用在了不同的领域。而 Cython 的美丽之处就在于:它将 Python 语言丰富的表达能力、动态机制和 C 语言的高性能汇聚在了一起,并且代码写起来仍然像写 Python 一样。

注意:除了极少数的例外,Python 代码(2.x和3.x版本)已经是有效的 Cython 代码,因为 Cython 可以看成是 Python 的超集。并且 Cython 在 Python 语言的基础上添加了一些少量的关键字来更好地开发 C 的类型系统,从而允许 Cython 编译器生成高效的 C 代码。如果你已经知道 Python 并且对 C 或 C++ 有一定的基础了解,那么你可以直接学习 Cython,无需再学习其它的接口语言。

另外,我们其实可以将 Cython 当成两个身份来看待:

  1. 如果将 Cython 翻译成 C,那么可以看成 Cython 的 '阴';
  2. 如果将 Python 作为胶水连接 C 或者 C++,那么可以看成是 Cython 的 '阳'。

我们可以从需要高性能的 Python 代码开始,也可以从需要一个优化 Python 接口的 C、C++ 开始,而我们这里是为了学习 Cython,因此显然是选择前者。为了加速 Python 代码,Cython 将使用可选的静态类型声明并通过算法来实现大量的性能提升,尤其是静态类型系统,这是实现高性能的关键。

Cython 和 CPython 的区别?

关于 Cython,最让人困惑的就是它和 CPython 之间的关系,但是需要强调的是这两者是完全不同的。

首先 Python 是一门语言,它有自己的语法规则,我们按照 Python 语言规定的语法规则编写的代码就是 Python 源代码。但是源代码只是一个或多个普通的文本文件,我们需要使用 Python 语言对应的解释器来执行它。

而 Python 解释器也会按照同样的语法规则来对我们编写的 Python 源代码进行分词、语法解析等等,如果我们编写的代码不符合 Python 的语法规则,那么会报出语法错误,也就是 SyntaxError。如果符合语法规范的话,那么会顺利地生成抽象语法树(Abstract Syntax Tree,简称 AST),然后将 AST 编译成指令集合,也就是所谓的字节码(bytes code),最后再执行字节码。

所以 Python 源代码是需要 Python 解释器来操作的,如果我们想做一些事情的话,光写成源代码是不行的,必须要由 Python 解释器将我们的代码解释成机器可以识别的指令进行执行才可以。而 CPython 正是 Python 语言对应的解释器,并且它也是官方实现的标准解释器,同时还是使用最广泛的一种解释器。基本上我们使用的解释器都是 CPython,也就是从官网下载、然后安装之后所得到的。

标准解释器 CPython 是由 C 语言实现的,除了 CPython 之外还有 Jython(java实现的 Python 解释器)、PyPy(Python 语言实现的 Python 解释器)等等。总之设计出一门语言,还要有相应的解释器才可以;至于编译型语言,则是对应的编译器。

最后重点来了,我们说 CPython 解释器是由 C 实现的,它给 Python 语言提供了 C 级别的接口,也就是熟知的 Python/C API。比如:Python 的列表,底层对应的是 PyListObject;字典则对应 PyDictObject,等等等等。

所以当我们在 Python 中创建一个列表,那么 CPython 在执行的时候,就会在底层创建一个 PyListObject。因为 CPython 是用 C 来实现的,最终肯定是将 Python 代码翻译成 C 级别的代码,然后再变成机器码交给 CPU 执行。

而 Cython 也是如此,Cython 代码也要被翻译成 C 代码,然后 C 代码再变成扩展(本质上也是机器码),导入之后直接执行,而无需动态解释。因此 Cython 是一门语言,它并不是Python 解释器的另一种实现,它的地位和 CPython 不是等价的,不过和 Python 是平级的。

总结:Cython 是一门语言,可以通过 Cython 源代码生成高效的 C 代码,再将 C 代码编译成扩展模块,同样需要 CPython 来进行调用。

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源代码
    +关注

    关注

    94

    文章

    2926

    浏览量

    66061
  • python
    +关注

    关注

    51

    文章

    4674

    浏览量

    83464
收藏 人收藏

    评论

    相关推荐

    电感质量不好会有什么后果

    电子发烧友网站提供《电感质量不好会有什么后果.docx》资料免费下载
    发表于 03-29 14:51 0次下载

    密封试验仪为什么会有泄漏量

    在许多工业生产和科研实验中,密封是保证产品质量的关键指标。密封试验仪在这个过程中起着关键作用。然而,在进行密封测试时,我们经常会遇到一个专业术语——泄漏。那么,为什么会有泄漏呢?它反映了哪些深刻
    的头像 发表于 03-22 11:40 110次阅读
    密封试验仪为什么<b class='flag-5'>会有</b>泄漏量

    CYT2BL ADC超频使用会有风险吗?

    依据datasheet 的说明,该芯片最大支持26.67Mhz 的时钟 ,但是我们项目中,配置成了40MHZ,未发生异常,请问会有什么风险点嘛?
    发表于 01-22 07:50

    为什么电压探头会有降额曲线指标,它的意义是什么呢?

    为什么电压探头会有降额曲线指标,它的意义是什么呢? 电压探头是一种用于测量电路中的电压的设备,它通常由一个金属探针和一个放大器组成。在使用电压探头进行测量时,我们会发现在一定频率范围内,探头的输出
    的头像 发表于 01-08 11:30 399次阅读

    ADE7880电流输入端为什么会有很大的噪声?

    ADE7880电流输入端为什么会有很大的噪声(约80mv),当电流输入端悬空时,通过示波器测量有1.7v的波形。请问这是怎么的?
    发表于 12-26 08:32

    请问ad缓冲是什么?开启缓冲会有什么好处?

    请问ad缓冲是什么?开启缓冲会有什么好处?会影响其他的性能吗,比如采样速率等。
    发表于 12-20 08:08

    AD7810没有输入会有输出吗?

    AD7810没有输入会有输出么?如果有输出是片子坏了么?两路AD7810同样的程序,只有一路会有这个情况。
    发表于 12-12 06:06

    Pandas:Python中强大方便的绘图功能

    Pandas是Python中非常常用的数据处理工具,使用起来非常方便。由于建立在NumPy数组结构之上,所以它的很多操作通过NumPy或者Pandas自带的扩展模块编写,这些模块用Cython编写
    的头像 发表于 11-03 11:04 251次阅读
    Pandas:Python中强大方便的绘图功能

    Kivy :开源跨平台的Python 框架

    。 本教程将教你如何使用 Kivy 编写一款乒乓球游戏。我们将从一个基本的应用程序开始,描述创建这个游戏的每个步骤。 Kivy 是用 Python 和 Cython 编写的,基于 OpenGL ES 2,支持各种输入设备并拥有丰富的部件库。使用相同的代码,你可直接实现多平台应用,包括 Windo
    的头像 发表于 10-31 15:27 565次阅读
    Kivy :开源跨平台的Python 框架

    为什么会有0欧电阻这种东西?0欧电阻有哪些用途?

    为什么会有0欧电阻这种东西?0欧电阻有哪些用途? 0欧电阻是一种低阻电阻器,其阻值非常小,通常为0.1mΩ或更小,实际上可以认为是没有阻值的电阻器。0欧电阻也被称为“短接电阻器”,因为它是用来将信号
    的头像 发表于 10-22 15:03 1430次阅读

    如何使用 Kivy 编写一款乒乓球游戏

    。 本教程将教你如何使用 Kivy 编写一款乒乓球游戏。我们将从一个基本的应用程序开始,描述创建这个游戏的每个步骤。 Kivy 是用 Python 和 Cython 编写的,基于 OpenGL ES 2,支持各种输入设备并拥有丰富的部件库。使用相同的代码,你可直接实现多平台应用,包括 Windo
    的头像 发表于 10-21 14:36 281次阅读
    如何使用 Kivy 编写一款乒乓球游戏

    对于STM32的控制系统如果频繁进入中断会有问题吗?

    频繁进入中断会不会有其他的问题
    发表于 10-15 09:04

    为什么运放会有虚短虚断?

    为什么运放会有虚短虚断?  运放是集成电路的一种,主要用于信号放大和处理。在实际使用过程中,可能会发现运放出现虚短虚断这种现象,这是由于多种因素造成的。 首先,需要了解运放的构造原理。运放是由多个
    的头像 发表于 09-20 16:29 772次阅读

    传输线的损耗除了幅度会衰减之外,还会有什么影响呢?

    因为有限的电导率和有损耗的填充介质,传输线会有损耗。
    的头像 发表于 08-09 14:13 1025次阅读
    传输线的损耗除了幅度会衰减之外,还<b class='flag-5'>会有</b>什么影响呢?

    SMT贴片加工中为什么会有锡珠?

    在SMT贴片加工中,锡珠现象是主要缺陷之一,锡珠产生的原因很多,而且不容易控制。下面佳金源锡膏厂家给大家介绍一下smt过程中为什么会有锡珠:1、锡膏印刷厚度与印刷量在SMT贴片加工中,锡膏的印刷厚度
    的头像 发表于 07-13 14:31 715次阅读
    SMT贴片加工中为什么<b class='flag-5'>会有</b>锡珠?