能让Python提速超40倍的神器Cython详解


Posted in Python onJune 24, 2021

让Python提速超过40倍的神器:Cython

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

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

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

1、什么是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

2、Cython的类型

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

对于变量,我们有:

cdef int a, b, c
cdef char *s
cdef float x = 0.5 (single precision)
cdef double x = 63.4 (double precision)
cdef list names
cdef dict goals_for_each_play
cdef object card_deck

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

对于功能:

def — regular 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 Cython
cpdef — C and Python. Can be accessed from both C and Python

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

3、使用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 setup
from 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_python
import run_cython
import time
 
 
number = 10
 
 
start = time.time()
run_python.test(number)
end =  time.time()
 
py_time = end - start
print("Python time = {}".format(py_time))
 
start = time.time()
run_cython.test(number)
end =  time.time()
 
cy_time = end - start
print("Cython time = {}".format(cy_time))
 
 
print("Speedup = {}".format(py_time / cy_time))

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

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

能让Python提速超40倍的神器Cython详解

到此这篇关于能让Python提速超40倍的神器Cython详解的文章就介绍到这了,更多相关Cython加速Python内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
简单介绍Python中的RSS处理
Apr 13 Python
python微信公众号之关键词自动回复
Jun 15 Python
Python版名片管理系统
Nov 30 Python
Django 模型类(models.py)的定义详解
Jul 19 Python
python 两个数据库postgresql对比
Oct 21 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 Python
python等差数列求和公式前 100 项的和实例
Feb 25 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
Python实现扫码工具的示例代码
Oct 09 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 Python
Python初学者必备的文件读写指南
Jun 23 Python
FP-growth算法发现频繁项集——构建FP树
python ansible自动化运维工具执行流程
关于python中readlines函数的参数hint的相关知识总结
详解Python为什么不用设计模式
linux中nohup和后台运行进程查看及终止
Jun 24 #Python
Python面向对象之成员相关知识总结
Jun 24 #Python
Python面向对象之内置函数相关知识总结
Jun 24 #Python
You might like
浅谈电磁辐射对健康的影响
2021/03/01 无线电
加速XP搜索功能堪比vista
2007/03/22 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
php mysql 封装类实例代码
2016/09/18 PHP
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
JavaScript 面向对象之命名空间
2010/05/04 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
Python变量和数据类型详解
2017/02/15 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
Python实现基于POS算法的区块链
2018/08/07 Python
python读取xlsx的方法
2018/12/25 Python
Python脚本按照当前日期创建多级目录
2019/03/01 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
宿舍使用违章电器检讨书
2014/01/12 职场文书
科研先进个人典型材料
2014/01/31 职场文书
买卖协议书范本
2014/04/21 职场文书
师范生自荐信模板
2014/05/28 职场文书
小学生差生评语
2014/12/29 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
催款律师函范文
2015/05/27 职场文书
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js