cython与python的不同都有哪些

author author     2023-03-28     532

关键词:

Cython是Python的一个超集,结合了Python的易用性和原生代码的速度,可以编译成C语言,产生的性能提升可以从几个百分点到几个数量级,具体

Cython是Python的一个超集,结合了Python的易用性和原生代码的速度,可以编译成C语言,产生的性能提升可以从几个百分点到几个数量级,具体取决于手头的任务。

使用Cython,你可以避开Python的许多原生限制,或者完全超越Python,而无需放弃Python的简便性和便捷性。

Python代码可以直接调用C模块。这些C模块可以是通用的C库或专门为Python工作的库。Cython生成第二种类型的模块:与Python内部对话的C库,可以与现有的Python代码绑定在一起。

Cython代码在设计上看起来很像Python代码。如果你给Cython编译器提供了一个Python程序,它将会按原样接受它,但是Cython的原生加速器都不会起作用。但是如果你用Cython的特殊语法来修饰Python代码,那么Cython就可以用快速的C代替慢的Python对象。

请注意,Cython的方法是渐进的。这意味着开发人员可以从现有的Python应用程序开始,通过对代码立刻进行更改来加快速度,而不是从头开始重写整个应用程序。

这种方法通常与软件性能问题的性质相吻合。在大多数程序中,绝大多数CPU密集型代码都集中在一些热点上,也就是帕累托原则的一个版本,也被称为“80/20”规则。因此,Python应用程序中的大部分代码不需要进行性能优化,只需要几个关键部分。你可以逐渐将这些热点转换为Cython,从而获得你最需要的性能提升。程序的其余部分可以保留在Python中,以方便开发人员。

相关推荐:《Python入门教程》

Cython优势

除了能够加速已经编写的代码之外,Cython还具有其他几个优点:

使用外部C库可以更快

像NumPy这样的Python软件包可以在Python界面中打包C库,使它们易于使用。但是,这些包在Python和C之间来回切换会减慢速度。Cython可以让你直接与底层库进行通信,而不需要Python(也支持C ++库)。

可以同时使用C和Python内存管理

如果你使用Python对象,它们就像在普通的Python中一样被内存管理和垃圾收集。但是如果你想创建和管理自己的C级结构,并使用malloc/free来处理它们,你可以这样做,只记得自己清理一下。

可以根据需要选择安全性或速度

Cython通过decorator 和编译器指令(例如@boundscheck(False))自动执行对C中弹出的常见问题的运行时检查,例如对数组的超出边界访问。因此,由Cython生成的C代码默认比手动C代码安全得多。

如果确信在运行时不需要这些检查,则可以在整个模块上或仅在选择功能上禁用它们以获得额外的编译速度。

Cython还允许本地访问使用“缓冲协议”的Python结构,以直接访问存储在内存中的数据(无需中间复制)。Cython的“记忆视图”可以高速地在这些结构上进行工作,并且具有适合任务的安全级别。

Cython C代码可以从释放GIL中受益

Python的全局解释器锁(Global Interpreter Lock,GIL)同步解释器中的线程,保护对Python对象的访问并管理资源的争用。但GIL被广泛批评为Python性能的绊脚石,特别是在多核系统上。

如果有一段代码不会引用Python对象并执行长时间运行,那么可以使用nogil:指令将其标记为允许它在没有GIL的情况下运行。这使得Python中间人可以做其他事情,并允许Cython代码使用多个内核(附加工作)。

Cython可以使用Python类型的提示语法

Python有一个类型提示语法,主要由linters和代码检查器使用,而不是CPython解释器。 Cython有它自己的代码装饰的自定义语法,但是最近修改了Cython,你可以使用Python类型提示语法为Cython提供类型提示。

Cython限制

请记住,Cython不是一个魔术棒。它不会自动将每一个poky Python代码变成极速的C代码。为了充分利用Cython,你必须明智地使用它,并理解它的局限性:

常规Python代码的加速很少

当Cython遇到Python代码时,它不能完全翻译成C语言,它将这些代码转换成一系列对Python内部的C调用。这相当于将Python的解释器从执行循环中提取出来,这使得代码默认加速了15%到20%。请注意,这是最好的情况。在某些情况下,可能看不到性能改善,甚至性能下降。

原生Python数据结构有一点加速

Python提供了大量的数据结构 - 字符串,列表,元组,字典等等。它们对于开发者来说非常方便,而且他们自带了自动内存管理功能,但是他们比纯C慢。

Cython让你继续使用所有的Python数据结构,尽管没有太多的加速。这又是因为Cython只是在Python运行时调用创建和操作这些对象的C API。因此,Python数据结构的行为与Cython优化的Python代码大致相同:有时会得到一个提升,但只有一点。

Cython代码运行速度最快时,“纯C”

如果你在C中有一个标有cdef关键字的函数,那么它的所有变量和内联函数调用都是纯C的,所以它的运行速度可以和C一样快。 但是,如果该函数引用任何Python原生代码(如Python数据结构或对内部Python API的调用),则该调用将成为性能瓶颈。

幸运的是,Cython提供了一种方法来发现这些瓶颈:一个源代码报告,一目了然地显示您的Cython应用程序的哪些部分是纯C以及哪些部分与Python交互。 对应用程序进行了更好的优化,就会减少与Python的交互。

为Cython应用程序生成的源代码报告。 白色区域纯C;黄色区域显示与Python内部的交互。一个精心优化的Cython程序将尽可能的黄色。 展开的最后一行显示了解释其相应Cython代码的C代码。

Cython NumPy

Cython改进了基于C的第三方数字运算库(如NumPy)的使用。由于Cython代码编译为C,它可以直接与这些库进行交互,并将Python的瓶颈带出循环。

但是NumPy特别适用于Cython。 Cython对NumPy中的特定结构具有本地支持,并提供对NumPy数组的快速访问。在传统的Python脚本中使用的熟悉的NumPy语法可以在Cython中使用。

但是,如果要创建Cython和NumPy之间最接近的绑定,则需要使用Cython的自定义语法进一步修饰代码。例如,cimport语句允许Cython代码在编译时在库中查看C级构造,以实现最快的绑定。

由于NumPy被广泛使用,Cython支持NumPy“开箱即用”。如果你安装了NumPy,你可以在你的代码中声明cimport numpy,然后添加进一步的装饰来使用暴露的函数。

Cython分析和性能

可以通过分析代码并亲眼目睹瓶颈在哪里获得最佳性能。Cython为Python的cProfile模块提供钩子,因此可以使用Python自己的分析工具来查看Cython代码的执行情况。无需在工具组之间切换;可以继续所熟悉和喜爱的Python世界中工作。

它有助于记住所有情况下,Cython不是魔术,仍然适用明智的现实世界的表现实践。在Python和Cython之间来回穿梭越少,你的应用运行得越快。

例如,如果你有一个你想要在Cython中处理的对象的集合,那么不要在Python中迭代它,并且在每一步调用一个Cython函数。将整个集合传递给你的Cython模块并在那里迭代。这种技术经常在管理数据的库中使用,因此这是在自己的代码中模拟的好模型。

我们使用Python是因为它为程序员提供了便利,并且能够快速开发。有时程序员的工作效率是以牺牲性能为代价的。使用Cython,只需要一点点额外的努力就可以给你两全其美的好处。

参考技术A Cython是Python的一个超集,结合了Python的易用性和原生代码的速度,可以编译成C语言,产生的性能提升可以从几个百分点到几个数量级,具体取决于手头的任务。
使用Cython,你可以避开Python的许多原生限制,或者完全超越Python,而无需放弃Python的简便性和便捷性。
Python代码可以直接调用C模块。这些C模块可以是通用的C库或专门为Python工作的库。Cython生成第二种类型的模块:与Python内部对话的C库,可以与现有的Python代码绑定在一起。
Cython代码在设计上看起来很像Python代码。如果你给Cython编译器提供了一个Python程序,它将会按原样接受它,但是Cython的原生加速器都不会起作用。但是如果你用Cython的特殊语法来修饰Python代码,那么Cython就可以用快速的C代替慢的Python对象。
请注意,Cython的方法是渐进的。这意味着开发人员可以从现有的Python应用程序开始,通过对代码立刻进行更改来加快速度,而不是从头开始重写整个应用程序。
这种方法通常与软件性能问题的性质相吻合。在大多数程序中,绝大多数CPU密集型代码都集中在一些热点上,也就是帕累托原则的一个版本,也被称为80/20规则。因此,Python应用程序中的大部分代码不需要进行性能优化,只需要几个关键部分。你可以逐渐将这些热点转换为Cython,从而获得你最需要的性能提升。程序的其余部分可以保留在Python中,以方便开发人员。

python与c区别都有哪些

第一点:语言类型不同python是一种动态类型语言,又是强类型语言。它们确定一个变量的类型是在您第一次给它赋值的时候。C是静态类型语言,一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任... 查看详情

在 TypeORM 中使用 QueryBuilder 与 Repository 都有哪些不同的用例? [关闭]

】在TypeORM中使用QueryBuilder与Repository都有哪些不同的用例?[关闭]【英文标题】:WhatarethedifferentusecasesforusingQueryBuildervs.RepositoryinTypeORM?[closed]在TypeORM中使用QueryBuilder与Repository有哪些不同的用例?[关闭]【发布时间】:2020-03-0211:13:... 查看详情

cython和python的区别

cython是用c写的python实现Cython是不同的语言,相当于Python再加上些C特性,比如说类型声明。参考技术ACython是Python的一个超集,结合了Python的易用性和原生代码的速度,可以编译成C语言,产生的性能提升可以从几个百分点到几个... 查看详情

XMPP 带内注册(XEP-0077):与简单的 jid/pw 登录不同,都有哪些步骤?

】XMPP带内注册(XEP-0077):与简单的jid/pw登录不同,都有哪些步骤?【英文标题】:XMPPin-bandregistration(XEP-0077):Differsfromsimplejid/pwlogin,whatarethesteps?XMPP带内注册(XEP-0077):与简单的jid/pw登录不同,有哪些步骤?【发布时间】:2014-... 查看详情

如何在 Cython 中使用不同的 C++ 编译器?

】如何在Cython中使用不同的C++编译器?【英文标题】:HowtouseadifferentC++compilerinCython?【发布时间】:2019-12-0200:20:45【问题描述】:我正在开发一个从Python调用C++的项目。我们为此目的使用Cython。使用命令“python3.6setup.pybuild_ext--inp... 查看详情

python入门书籍都有哪些推荐?

0.9518861、Python基础教程:是经典的Python入门教程书籍,本书层次鲜明,结构严谨。这本书既适合初学者夯实基础,又能帮助Python程序员提升技能,即使是Python方面的技术专家,也能从书里找到实用性极强的内容。2、Python数据分... 查看详情

与 Python 中的多处理相比,concurrent.futures 都有哪些优势?

】与Python中的多处理相比,concurrent.futures都有哪些优势?【英文标题】:Whataretheadvantagesofconcurrent.futuresovermultiprocessinginPython?与Python中的多处理相比,concurrent.futures有哪些优势?【发布时间】:2012-07-2123:44:25【问题描述】:我正... 查看详情

python基本内置数据类型都有哪些

...,但是所有内置类型的定义都与计算机的运算方式相关。Python主要内置类型包括数值、序列、映射、类、实例和异常等。数值类型:全局中只有一个(Python在解释器启动的时候,Python会用None类型生成一个None的对象),包括int类... 查看详情

3,css引入方式都有哪些,常应用哪里?不同引入方式的优势与劣势都有哪些

参考技术A1、符合W3C标准。2、支持浏览器的向后兼容,也就是无论未来的浏览器大战,胜利的是IE7或者是火狐,您的网站都能很好的兼容。3、搜索引擎更加友好。相对与传统的table,采用DIV+CSS技术的网页,对于搜索引擎的收录更... 查看详情

python库都有哪些

...少的库。Numpy通过将高速C库包装在Python接口中来工作,而Cython使用可选的类型将Python编译为C以提高性能。但是Numba无疑是最方便的,因为它允许使用装饰器选择性地加速 查看详情

制作简单的静态网站多语言的选项都有哪些?

...正在建立一个静态网站,我想以两种语言显示。我找不到不同选项的全面概述(例如,服务器端加载与前端加载与使用不同文件夹。每个选项的优势是什么(例如,对于SEO、可维护 查看详情

可以与 AWS 中的安全组关联的所有资源都有哪些?

...几乎毫无用处。是否有任何资源或可以属于一个安全组和不同类型的安全组的所有资源的编译列表?这是我目前所拥有的: 查看详情

webapi与传统的webservice都有哪些不同

WebService是利用HTTP管道实现了RPC的一种规范形式,放弃了对HTTP原生特征与语义的完备支持;而WebAPI是要保留HTTP原生特征与语义的同时实现RPC,但WebAPI的实现风格可以是千姿百态,RESTful只是实现了其中一种风格,你也可以定义一... 查看详情

将 cython 函数与 cython 方法传递给 scipy.integrate

】将cython函数与cython方法传递给scipy.integrate【英文标题】:Passingacythonfunctionvsacythonmethodtoscipy.integrate【发布时间】:2015-10-0119:38:36【问题描述】:我正在尝试研究如何使用cython来加速涉及在我定义的类中完成的积分的计算。我试... 查看详情

linux驱动开发与linux嵌入式开发都有哪些相同点和不同点?两者都要学的基础知识都有哪些?

Linux嵌入式开发包括了Linux驱动开发.Linux嵌入式开发,包括了从应用层到底层驱动等等,驱动开发就属于底层开发.都要学的基础知识,就是C语言,Linux,还有各种计算机原理那块的知识.参考技术A应该说嵌入式开发范围大一点,linux驱动... 查看详情

Cython 精度和数据类型

】Cython精度和数据类型【英文标题】:Cythonprecisionanddatatypes【发布时间】:2016-03-1112:44:36【问题描述】:我知道在cython中会丢失一些精度,因为cython浮点数与python浮点数不同。因此,我重新定义了一个变量,如下所示:cdeflongdoub... 查看详情

python的web开发框架都有哪些

...GearsTurboGears也称为是框架的终结者,因为它虽然有着其他Python框架都有的功能,却不像其他框架那样有局限性。它甚至能适用于简单的微架构项目。它给人的感觉就不像是工作在框架上,而像是在写新的功能。你可以在几分钟之... 查看详情

呼叫(电话)中都有哪些不同类型的状态

】呼叫(电话)中都有哪些不同类型的状态【英文标题】:whataredifferenttypesofstateincalling(telephony)呼叫(电话)中有哪些不同类型的状态【发布时间】:2019-11-2915:44:55【问题描述】:我想简要了解一下电话中不同类型的状态(如等... 查看详情