让Python提速超过30倍的必杀技:Cython

640?wx_fmt=1

640?wx_fmt=png

编辑:鹏飞

来源:新智元

【新智元导读】众所周知,作为人工智能界最流行的语言,Python功能强大,但也运行缓慢。如果你的代码是纯Python、或者必须用一个大的for循环并且不能放入矩阵因为数据必须按顺序处理的时候,有没有办法加速Python呢?本文为你解答。


人工智能最火的语言,自然是被誉为迄今为止最容易使用的代码之一的Python。Python代码素来以直观、高可读性著称。


然而,易用的背后,是Python无法逾越的障碍:慢。尤其是C程序员,这群快枪手简直无法忍受Python的慢。


所以有人就想了各种方法去解决这个问题,本文就介绍其中的一种。如果你的代码是纯Python,或者你必须用一个大的for循环却无法放入矩阵因为数据必须按顺序处理,那么就可以使用Cython来加速Python。


什么是Cython?


根据维基百科:Cython是结合了Python和C的语法的一种语言,可以简单的认为就是给Python加上了静态类型后的语法,使用者可以维持大部分的Python语法,而不需要大幅度调整主要的程式逻辑与算法。但由于会直接编译为二进制程序,所以性能较Python会有很大提升。


Cython被大量运用在CPython函式库的撰写,以取得较高的执行效能。Cython将CPython代码转译成 C 或 C++ 语法后,自动包装上函式呼叫界面生成 .pyx 后缀的执行档,即可当成普通的函式库。其性能一般逊于原生的 C/C++ 函式库,但由于 CPython 语法的易用性可以缩短开发时间。Cython 也可以用于编译以 C/C++ 为 CPython 撰写的函式库。


目前Cython可以在 Windows, macOS 与 Linux 上使用,可以编译 2.6, 2.7 与 3.3 至 3.7 版本的 CPython 语法。


我们对Python代码的唯一调整是向每个变量添加类型信息。通常,我们可以在Python中声明一个变量,如下所示:


x = 0.5


使用Cython,我们将为该变量添加一个类型:


cdef float x = 0.5


这告诉Cython我们的变量是浮点数,和C一样。使用纯Python,变量的类型是动态确定的。Cython中类型的显式声明是可以转换为C的原因,因为需要显式类型声明+。


安装Cython只需要一行pip:


pip install cython


Cython的类型


使用Cython时,有两种不同的类型,用于变量和函数。


对于变量,我们有:


cdef int a, b, ccdef char *scdef float x = 0.5 (single precision)cdef double x = 63.4 (double precision)cdef list namescdef dict goals_for_each_playcdef object card_deck


请注意所有这些类型都来自C/C++! 


对于功能:


defregular python function, calls from Python only.cdef — Cython only functions which can’t be accessed from python-only code i.e must be called within Cythoncpdef — C and Python. Can be accessed from both C and Python


由此开始,我们要开启加速了哦!准备好…


使用Cython加速代码


我们要做的第一件事就是设置Python代码基准:用于计算数字阶乘的for循环。 


原始Python代码如下所示:


def test(x):
y = 1
for i in range(x+1):
y *= i
return y


Cython相同功能看起来非常相似。确保Cython代码文件使用 .pyx扩展名。代码本身的唯一变化是我们需要提前声明变量和函数的类型,示例代码如下:


cpdef int test(int x):
cdef int y = 1
cdef int i
for i in range(x+1):
y *= i
return y


注意函数有一个cpdef来确保我们可以从Python调用它。另外还需要为函数中的所有变量设置类型从而告知C编译器。


接下来,创建一个setup.py文件,该文件将Cython代码编译为C代码:


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


并执行编译:


python setup.py build_ext --inplace


搞定!我们的C代码已经编译好并且可以使用了。


在Cython代码所在的文件夹中拥有运行C代码所需的所有文件,包括run_cython.c文件,你尽可以进去仔细看个究竟。


现在,我们要测试全新超快速C代码了!准备好了吗?3、2、1、go!


import run_pythonimport run_cythonimport time

number = 10

start = time.time()run_python.test(number)end = time.time()

py_time = end - startprint("Python time = {}".format(py_time))

start = time.time()run_cython.test(number)end = time.time()

cy_time = end - startprint("Cython time = {}".format(cy_time))

print("Speedup = {}".format(py_time / cy_time))


Cython几乎可以为任何原始Python代码提供良好的加速,不需要做太多额外的工作。记住,你用的循环越多、处理的数据越多,Cython就越有帮助。


看看下表,其中显示了Cython为不同的阶乘值提供了多少速度。我们使用Cython获得了超过36倍的加速!


640?wx_fmt=png


参考链接: https://towardsdatascience.com/use-cython-to-get-more-than-30x-speedup-on-your-python-code-f6cb337919b6

640?wx_fmt=gif

640?wx_fmt=jpeg

CDA 课程咨询丨史老师

联系电话:18080942131 640?wx_fmt=jpeg扫描二维码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Cython: A Guide for Python"是一本关于Cython的PDF指南。Cython是一个用于编写Python扩展的工具,可以将Python代码编译成C语言,从而提高程序的执行效率。这本指南旨在帮助Python开发者了解Cython的基本概念和用法。 首先,指南介绍了Cython的基本特性和优势。Cython能够将Python代码转换成C语言,通过编译和优化提高执行速度。它还支持Python的动态类型和对象模型,使得开发者可以灵活地使用Python语法和标准库。同时,Cython还提供了与C语言的直接互操作性,可以轻松调用C语言库函数和数据结构。 接下来,指南详细介绍了Cython的语法和编译过程。开发者可以学习如何使用Cython扩展Python代码,并且了解如何编写Cython的类型注释以提高性能。此外,指南还提供了一些优化技巧,帮助开发者在Cython中充分利用静态类型和C语言特性。 此外,指南还介绍了如何在不同的开发环境中配置和使用Cython。它提供了关于如何在命令行上使用Cython编译器和构建系统的说明,还介绍了如何在常见的集成开发环境(如PyCharm、Visual Studio Code等)中配置Cython插件。 最后,指南介绍了一些Cython的高级特性和扩展应用。例如,它探讨了如何在Cython中使用并行计算和多线程,并简要介绍了Cython与NumPy、Pandas等Python科学计算库的集成。 总的来说,"Cython: A Guide for Python"这本指南提供了一个全面而深入的学习资源,帮助开发者掌握Cython的使用技巧。通过学习这本指南,开发者可以利用Cython提高Python程序的执行效率,并且在需要使用C语言特性和库函数的场景中灵活应用Cython

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值