社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

CDA数据分析师 • 6 年前 • 526 次点击  

编辑:鹏飞

本文转自公众号:新智元

【导读】众所周知,作为人工智能界最流行的语言,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倍的加速!



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





CDA 课程咨询丨赵老师

联系电话:13381275813
扫描二维码







更多精彩文章

· 从全方位为你比较3种数据科学工具的比较:Python、R和SAS

· 干货 | 如何用Python开启你的机器学习之路

· 免费!10本必读的机器学习书籍(附下载)

· AI就业排名出炉:机器学习霸榜、薪资最高;但AI岗位需求正放缓

· Python 最抢手、Java 最流行、7000 位程序员揭秘 2019 软件开发现状

· CDA第十届认证考试数据报告重磅发布!


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/36880
 
526 次点击