首页 / 创业融资 / 正文
提速30倍!这个加速包让Python代码飞起来
leihan 发表于:2020-3-23 13:51:36 复制链接 看图 发表新帖
阅读数:16991

下载APP可以快速和圈友联系

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
提速30倍!这个加速包让Python代码飞起来-1.jpg

大数据文摘出品

编译:啤酒泡泡、安好

Python是社区里最受爱好的编程说话!它是今朝为止最易利用的说话,由于它的代码短小精悍,合适人们的思维方式,也合适人们的阅读习惯。

可是你会经常听到有人吐槽Python,特别是有些C说话的大牛吐槽Python速度慢。

他们说得没错,相比其他高级法式设想说话,如C说话来说,Python确切速度很慢,这主如果由于C说话更面向计较机底层,像一些单片机、电路板的设想都利用C说话,C说话和汇编说话之间的转换也更快,可是“every coin has two sides”,没有完善无缺的编程说话,C说话也有着其诸如代码量大、面向进程的一些弱点,若何让Python兼顾C说话速度方面的优点呢?

一个很形象的例子,就像上图展现的一样,赛车手需要兼顾汽车的策动引擎的内讧磨损,也要兼顾赛车的运转速度,那末,若何在两者之间获得平衡呢?

实在有很多可以进步运转速度的法子,比如:
    操纵多进程库来利用一切的CPU内核;假如你正在利用NumPy,Pandas,或是Scikit-Learn库,那末可以利用Rapids来进步GPU的处置速度。

可是这只针对你的使命可以并行的情况,例如数据预处置、矩阵操纵等,上述法子都很棒,可是假如你只利用纯Python说话,那该怎样办呢?再比如,你必须利用一个很大的for循环,而且由于数据必须被顺序处置致使你没法利用矩阵,在这类情况下,有没有法子进步Python自己的速度呢?

Cython就是用来加速纯Python代码的。

什么是Cython?

从本质上讲,Cython是Python和C/C++的桥梁。它答应你对Python代码稍作点窜,然后把Python代码间接翻译成C说话代码。

你唯一需要点窜Python代码的地方就是在每一个变量前面加上它的范例,凡是,我们在Python里会这样声明变量:

x = 0.5

假如利用Cython,我们会给变量加上它的范例:

cdef float x = 0.5

这会告诉Cython,我们的变量是浮点型变量,这和我们在C说话中的操纵一样。利用纯Python说话,变量的数据范例在赋值后被自动界说。Cython这类显式的变量声明方式使得Python代码转换成C代码成为能够,由于C说话要求变量的数据范例必须在声明变量时写出来。

利用pip安装Cython只需一行代码:

pip install cython

Cython的数据范例

利用Cython时,Cython供给两类范例,一类用于变量,一类用于函数。

对于变量,我们可以这样写(请留意,这些范例都来自C/C++):
    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

对于函数,我们可以这样写:
    def – 普通的Python函数,只用Python诠释器cdef – Cython公用函数,不能经过纯Python代码利用该函数,必须在Cython内利用cpdef – C说话和Python共用。可以经过C说话大概Python代码利用该函数

有了对Cython的领会,我们可以更进一步,起头加速我们的代码了!

利用Cython进步代码的运转速度

首先,我们建立一个Python代码的基准——利用一个for循环来计较某个数的阶乘。以下是用纯Python说话写的代码:

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

利用Cython写出的函数和纯Python代码写出的函数很类似,首先,我们要确保Cython代码文件的扩大名是.pyx。然后,我们唯一点窜的地方就是在我们已声明的每个变量和函数前加上它们的范例,run_cython.pyx代码以下:

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

请留意,函数前有cpdef,以确保我们可以经过Python挪用该函数。同时请留意,for循环里的变量i也有范例信息,你需要设定函数中一切变量的范例,这样C说话编译器才能晓得需要利用什么范例!

接下来,建立一个setup.py文件,把Cython代码翻译成C代码:

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

然后履行汇编进程,在号令行输入以下号令:

python setup.py build_ext --inplace

我们的C代码已经被编译了,可以利用了!你可以在文件夹里看见你的Cython代码,你有了一切运转C代码所需要的文件,包括run_cython.c文件,文摘菌在win10系统尝试后文件夹结构以下:

提速30倍!这个加速包让Python代码飞起来-2.jpg

翻开run_cython.c后的部分代码(代码有点长,此处只展现开首变量声明和结尾的函数实现)

/***the beginning part of the code***/ /* Generated by Cython 0.29.13 *//* BEGIN: Cython Metadata{ "distutils": { "name": "run_cython", "sources": [ "run_cython.pyx" ] }, "module_name": "run_cython"}END: Cython Metadata */
#define PY_SSIZE_T_CLEAN#include "Python.h"#ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python.#elif PY_VERSION_HEX < 0x02060000 || (0x03000000  member )#endif#if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif#endif#ifndef DL_IMP
/****the end part of the code***/static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x;#if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); }#endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size)  2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1])  2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1])  3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2])


上一篇:这家不太著名的工作室,能够是最会做解谜游戏的“冒险专家”,而且一做就是整整10年
下一篇:Upper Deck铁盒版”乔丹卡“值钱不?一盒五张,还是金属卡!
温馨提示:
下载好向圈客户端可以随时随地交流学习经验,也可以和圈友发起聊天成为好友
好向圈www.kuaixunai.com是一个专业经验分享交流平台,请提供优质的经验内容分享,拒绝任何广告内容出现,低质量广告内容硬广包含手机号码,微信,QQ或者二维码,网址等形式存在可能会审核不通过 要想被各大搜索引擎尽快收录请做好内容原创工作,才会有更好的推广效果。
返回列表
使用道具 举报
#提速, #这个, #加速, #python, #代码
17 条评论
您需要登录后才可以回帖 登录 | 立即注册
孤毒的郎纬 发表于 2020-3-23 13:58:12 | 阅读全部
用Cpython转换成C后,烧录到单片机里?
使用道具 举报
回复
大果梨俗 发表于 2020-3-23 14:03:16 | 阅读全部
那还不如直接用c++
使用道具 举报
回复
此绝境不俚 发表于 2020-3-23 14:11:26 | 阅读全部
看似花里胡哨,却能解决部分刚需...
使用道具 举报
回复
123465592 发表于 2020-3-23 14:16:41 | 阅读全部
不错,不错正为这个烦
使用道具 举报
回复
歇天高傧 发表于 2020-3-23 14:24:22 | 阅读全部
花里胡哨的语法,还不如swig
使用道具 举报
回复
小东邪襄儿菊 发表于 2020-3-23 14:30:36 | 阅读全部
转发了
使用道具 举报
回复
敷衍灬敷w 发表于 2020-3-23 14:35:50 | 阅读全部
转发了
使用道具 举报
回复
满园西红柿 发表于 2020-3-23 14:41:02 | 阅读全部
转发了
使用道具 举报
回复
123465610 发表于 2020-3-23 14:45:17 | 阅读全部
转发了
使用道具 举报
回复
张李湾潘家园 发表于 2020-3-23 14:55:11 | 阅读全部
转发了
使用道具 举报
回复
一被提问就发呆 发表于 2020-3-23 15:04:46 | 阅读全部
转发了
使用道具 举报
回复
123465664 发表于 2020-3-23 15:10:08 | 阅读全部
转发了
使用道具 举报
回复
天空小宝宝挠 发表于 2020-3-23 15:19:01 | 阅读全部
转发了
使用道具 举报
回复
沈阳牛二冻 发表于 2020-3-23 15:27:33 | 阅读全部
转发了
使用道具 举报
回复
摩殳芭 发表于 2020-3-23 15:35:53 | 阅读全部
转发了
使用道具 举报
回复
太阳能手电筒迫 发表于 2020-3-23 15:44:09 | 阅读全部
转发了
使用道具 举报
回复
cqwlw 发表于 2020-3-23 15:49:48 | 阅读全部
转发了
使用道具 举报
回复
相关推荐
广告合作以及侵权投诉客服QQ:1623331347 江苏好向圈信息科技有限公司 网站地图1 网站地图2