使用cython加速代码运行
引入
毫无疑问,Python是社区最喜爱的编程语言!到目前为止,它是最容易使用的语言之一,因为python代码是用一种直观的、人类可读的方式编写的。
然而,你经常会反复听到一些对Python的抱怨,尤其是来自C语言爱好者的抱怨,这些抱怨无非就是Python很慢。
是的,他们并没有说错。
与许多其他编程语言相比,Python确实很慢。Benchmark game有一些比较不同编程语言在不同任务上的速度的可靠基准。
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/gpp-python3.html?source=post_page
对于Python,我们有几种不同的方法可以加快速度:
1.使用多进程库来使用所有的CPU核心
https://towardsdatascience.com/heres-how-you-can-get-a-2-6x-speed-up-on-your-data-pre-processing-with-python-847887e63be5
2.如果你使用Numpy、panda或Scikit-Learn,使用Rapids来加速GPU上的处理。
https://towardsdatascience.com/heres-how-you-can-accelerate-your-data-science-on-gpu-4ecf99db3430
如果你所做的实际上可以并行化,比如数据预处理或矩阵运算,这些都是很好的方法。
但是如果你的代码是纯Python的呢?如果你不得不使用一个很大的for循环,且不能将数据放入矩阵中,因为数据必须按顺序处理,那会怎样?有没有办法加快Python本身的速度呢?
答案是肯定的,这就是Cython来加速原生Python代码的地方。
什么是Cython?
Cython是Python和C/C++之间的一个中间步骤。它允许你编写纯Python代码,并且只需要做一些小修改,然后将其直接翻译成C代码。
你对Python代码所做的惟一调整就是向每个变量添加类型信息。通常,我们可以像这样在Python中声明一个变量:
x = 5
使用Cython,我们将向该变量添加一个类型:
cdef int x = 5
这告诉Cython,我们的变量是浮点类型,就像我们在C中所做的一样。对于纯Python,变量的类型是动态确定的。Cython中类型的显式声明使转换为C成为可能,因为显式类型声明是必须的。
安装Cython只需要一行简单的pip命令:
pip install cython
Cython中的类型
使用Cython时,变量和函数分别有不同的类型。
对于变量我们有以下类型:
cdef int a, b, c
cdef char *s
cdef float x = 0.5 (单精度)
cdef double x = 63.4 (双精度)
cdef list names
cdef dict goals_for_each_play
cdef object card_deck
注意所有这些类型都来自C/C++ ! 而对于方法我们有以下类型:
- def — 常规python函数,仅从python调用。
- cdef — 不能从python的代码中访问Cython的函数。即必须在Cython内调用
- cpdef — C 和 Python. 可以从C和Python中访问
了解了Cython类型之后,我们就可以直接实现加速了!
如何使用Cython加速python代码
我们要做的第一件事是设置Python代码基准:用于计算数值阶乘的for循环。原生Python代码如下:
def test(x):y = 1for i in range(x+1):y *= ireturn y
相同功能的Cython方法看起来非常相似。首先,我们将确保Cython代码文件具有**.pyx**扩展名。对代码本身的惟一更改是,我们已经声明了每个变量和函数的类型。
cpdef int test(int x):cdef int y = 1cdef int ifor i in range(x+1):y *= ireturn y
Boom ! 可以看到我们的C代码已经编译好了,可以使用了!
你将看到,在Cython代码所在的文件夹中,你拥有运行C代码所需的所有文件,包括run_cython.c文件。如果你感兴趣,可以查看一下Cython生成的C代码!
现在我们准备测试我们新的并且超级快的C代码!查看下面的代码,它实现了一个速度测试,将原生Python代码与Cython代码进行比较。
import run_python
import run_cython
import timenumber = 10start = 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))
代码非常直观,我们以与普通Python相同的方式导入文件,并以与普通Python相同的方式运行函数!
Cython几乎可以让你在所有原生Python代码上获得良好的加速,而不需要太多额外的工作。需要注意的关键是,循环次数越多,处理的数据越多,Cython可以提供的帮助就越多。
下表显示了Cython为不同的数值阶乘带来的加速性能。当数值为10000000的时候,可以看到,我们的Cython加速超过了36倍。
注意
目前我的运行存在有
DistutilsPlatformError: Unable to find vcvarsall.bat
错误,正在想办法解决,希望可以能尽快进入到一个c与python共存的世界
**注意:**该问题我已经解决,现在给出方法:
安装vsstudio2019,教程在:cython加速你的代码运行
参考文章:cython加速python使用
我运行的代码源文件:下载
使用笔记
使用cython加速代码运行相关推荐
- cython python3_30倍!使用Cython加速Python代码
原标题:30倍!使用Cython加速Python代码 作者:George Seif.Thomas Wolf.Lukas Frei 编译:1+1=6 | 公众号海外部 前言 你可能经常会一次又一次地听到 ...
- 用Cython加速Python代码,快到起飞!
点击⬆️"小詹学Python",选择"星标"公众号 重磅干货,第一时间送达 编译 | sunlei 发布 | ATYUN订阅号 本文介绍 如果您曾经用Pytho ...
- python pypy_Python之父的加速秘籍:PyPy能让代码运行得更快!
全文共2179字,预计学习时长6分钟 图源:unsplash 当我们提及Python时,常常指的是CPython,即C语言实现的Python,这就是PyPy发挥作用的地方啦.实话讲,Python很慢, ...
- python pandas for循环_高逼格使用Pandas加速代码,向for循环说拜拜!
原标题:高逼格使用Pandas加速代码,向for循环说拜拜! 作者:George Seif 编译:公众号翻译部 全网进行中··· 你为什么劝入/劝退Quant? 前言 使用Pandas datafra ...
- 图片人群计数模型代码运行指南
PaperWithCode 八大数据集模型排名:https://paperswithcode.com/task/crowd-counting 搜索关键词 "人群计数"(crowd ...
- 深度学习(五):FastFCN代码运行、测试与预测
目录 0 前言 1 环境配置 1.1 安装python包 1.2 下载detail-api 1.3 运行prepare_pcontext.py 1.4 运行 prepare_ade20k.py 2 训 ...
- python计算密集型提速_利用Cython加速计算密集型python任务
何为计算密集型任务 下面贴上网上找到的描述计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率.对视频进行高清解码等等,全靠CPU的运算能力.这种计算密集型任务虽然也可以用多任务完成 ...
- GMOEA代码运行2--运行环境的搭建和运行
GMOEA代码的运行 引言 Generative Adversial Networks(GAN) GAN生成的动机 什么是GAN GAN能做什么 GAN的训练过程 一个生动的比喻 GMOEA-- GA ...
- 【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行
[2021最新版]Python 并发编程实战,用多线程.多进程.多协程加速程序运行 视频地址:https://www.bilibili.com/video/BV1bK411A7tV/ P1 Pytho ...
- python语言是编译执行_加速Python运行的工具
加速Python运行的工具应用 如果你需要让你的Python程序加速运行,在不同的层次有一些不同的解决方案: 重写 你的 Python 代码, 通过 并行化parallelizing 和 优化opti ...
最新文章
- java snychronized_Java synchronized同步线程机制(三) | 学步园
- 天牛须matlab,基于天牛须搜索算法(BAS)优化BP神经网络的权值阈值代码
- Effective Java 英文 第二版 读书笔记 Item 14:In public classes,use accessor methods,not public fields...
- bulk of the 用法_代词的用法详解:第三部分(不定代词)
- win7分区c盘调整容量_C盘空间不足变红咋办?清理垃圾瘦身不如扩容,硬盘容量调整教程...
- NYOJ 116士兵杀敌(二) 树状数组
- C语言CURL实现HTTP POST、GET、PUT
- mysql全局变量的使用_mysql - 变量的使用
- 如何防范电改下分布式光伏的风险
- python判断线程结束_判断Threading.start新线程是否执行完毕的实例
- 天使投资,众筹与项目背书
- Nessus 安装文件和详细教程(kali系统,附网盘下载链接)
- Springboot过滤xss
- 闵帆老师《论文写作》课程心得
- 常见的SNS盈利模式(商业模式)
- 关于Lind.DDD.Api客户端的使用与知识分享
- c语言bzero函数头文件,嵌入q式c语言-文件操用.doc
- 零基础小白该如何学习人工智能?
- 国密算法:利用python进行sm2非对称算法的实现,国密算法库gmssl的使用
- 【计算机视觉】前景蒙版(alpha matte)与掩膜(mask)