使用Cython进行优化简介 - Cython教程


在Python中,当你声明一个变量时,如:

x  =  5.0

你永远不必告诉语言变量’x’是一个整数。事实上,以后,你可以将’Gary’分配给x并且很好。这是因为Python会每隔一段时间检查一次以确定类型。这被称为“动态打字”。

这很好,并且使得学习最初非常简单,Python实际上只是一种教学语言,但是这会严重降低速度。

相反,如果我们愿意,我们可以使用静态打字和Cython来获得一些严重的加速。许多语言更像是:

float  x  =  5.0

Cython需要这样的东西:

cdef  float  x  =  5.0
  • linux 安装编译器(C/C++) sudo apt-get install build-essential

  • Windows:使用MinGW,或者获得编译您的Python版本的完全相同版本的Visual C。以下是适用于Windows的MinGW的Cython指南 http://cython.readthedocs.io/en/latest/src/tutorial/appendix.html

一旦你有了Cython和一个编译器,让我们通过Cython工作流程并制作我们自己的C-Exension!我们从一个简单的python文件开始:

# example_original.py
def test(x):y = 0for i in range(x):y += ireturn y

我们如何准备这个文件通过Cython传递?简单而不是.py,我们做.pyx

#example_cython.pyx
def test(x):y = 0for i in range(x):y += ireturn y

我们显然还没有任何输入信息。稍后我们会补充说,但现在,我们将坚持这一点。

一旦你有.pyx,你就可以开始构建。为此,我们将制作一个setup.py文件:

from distutils.core import setup
from Cython.Build import cythonizesetup(ext_modules = cythonize('example_cython.pyx'))

接下来,在您的终端中,执行:

python3 setup.py build_ext --inplace

这应该创建一个构建目录,一个C文件(.c)和一个共享对象文件(.so)。有了这个,我们可以导入我们的C-extension。为了说明这一点,您现在可以删除或以其他方式移动您的example.pyexample.pyx文件,以便保留build,.c和.so文件。现在创建一个名为testing.py的新文件,我们可以导入新的c扩展名:

#testing.py
import example_cythonexample_cython.test(5)

所以我们还没有真正做过任何Cython输入…等等,所以这段代码没有更好的优化,但是这实际上很有趣,因为它很简单,它表明你可以尽可能多地做,或者尽可能少地使用Cython实现。

现在,我们将开始添加输入信息。让我们回顾一下键入声明:

cdef声明

cdef int x,y,z
cdef char *s
cdef float x = 5.2 (single precision)
cdef double x = 40.5 (double precision)
cdef list languages
cdef dict abc_dict
cdef object thing

def, cdef, and cpdef

  • def - 常规的python函数,仅来自Python的调用。
  • cdef - cython只有函数,不能从python-only代码访问这些函数,必须在Cython中进行访问,因为对于这些函数将不会有C语言转换。
  • cpdef - C和Python。 将为Python创建一个C函数和一个包装器。 为什么不总是使用cpdef? 在某些情况下,你可能只有C指针,就像C数组一样。 但是,我们将主要使用cpdef

现在,我们将从之前的相同代码开始:

#example_cython.pyx
def test(int x):cdef int y = 0cdef int ifor i in range(x):y += ireturn y
#setup.py
from distutils.core import setup
from Cython.Build import cythonizesetup(ext_modules = cythonize('example_cy.pyx'))
#testing_things.py
import timeitcy = timeit.timeit('''example_cy.test(5)''',setup='import example_cy',number=100)
py = timeit.timeit('''example.test(5)''',setup='import example', number=100)print(cy, py)
print('Cython is {}x faster'.format(py/cy))

不错! 还有一些其他的细微变化,比如:

cpdef int test(int x):cdef int y = 0cdef int ifor i in range(x):y += ireturn y
#testing_things.py
import timeitcy = timeit.timeit('''example_cy.test(5000)''',setup='import example_cy',number=100)
py = timeit.timeit('''example.test(5000)''',setup='import example', number=100)print(cy, py)
print('Cython is {}x faster'.format(py/cy))

我们必须分析我们可以尝试使用cython的领域的一个选项是通过cythonize的html输出。 例如,让我们将我们原始的Python脚本转换为.pyx:

#furthertesting.pyx
def test(x):y = 0for i in range(x):y += ireturn y
$ cython -a furthertesting.pyx

现在我们可以看到,与Python的唯一关系是我们的cpdef,因为我们希望能够在Python中使用这个函数。

好的,这就是现在所有的Cython。我可能会在未来引入更多高级主题,但是,不管你信不信,你的大部分收获将纯粹来自使用静态类型。您还可以查看各种命令,如“与nogil”。如果你愿意,Cython可能会变得更加复杂。如果您熟悉C / C ++,我强烈建议您更多地参与。否则,请考虑Python代码中哪些地方需要继续验证某些变量的类型。这可以是循环的,也可以是扩展的程序。例如,如果您的网站流量很大,或者您有某种爬网机器,或者您正在分析股票的价格价格,那么无论您何时扩大使用变量,都应该考虑添加类型一些严重的性能改进信息。

正如你所见,这样做是非常快速和无痛的。希望它有帮助!

Cython优化简介相关推荐

  1. Py之cython:python库之cython的简介、安装、使用方法之详细攻略

    Py之cython:python库之cython的简介.安装.使用方法之详细攻略 目录 cython的简介 cython的安装 cython的使用方法 cython的简介 Cython语言使得Pyth ...

  2. HTML5和Intersection Observer的响应式图像优化简介

    by Riccardo Canella 里卡多·卡内拉(Riccardo Canella) HTML5和Intersection Observer的响应式图像优化简介 (An intro to res ...

  3. C++性能优化(一)——应用程序性能优化简介

    一.程序性能优化简介 1.程序性能优化简介 在计算机发展的早期阶段,硬件资源相对而言是非常昂贵的,CPU运行时间与内存容量给程序开发人员设置了极大限制.因此,早期的程序对运行性能和内存空间占用的要求是 ...

  4. GPU 计算 - GPU 优化简介

    GPU 优化简介 原文 - An Introduction to GPU Optimization 采用 GPUs 加速简单的计算任务. 计算机处理的很多任务都会遇到大量的计算,耗时较多的问题:而且, ...

  5. g2o图优化简介与基本使用方法

    一.g2o简介 g2o(General Graphic Optimization)是一个基于图优化的库,将非线性优化与图论结合起来的理论,我们可以利用g2o求解任何可以表示为图优化的最小二乘问题. 图 ...

  6. 深度学习中的优化简介

    深度学习算法在许多情况下都涉及到优化. 1. 学习和纯优化有什么不同 在大多数机器学习问题中,我们关注某些性能度量P,其定义于测试集上并且可能是不可解的.因此,我们只是间接地优化P.我们系统通过降低代 ...

  7. Android之开发性能优化简介

    原帖地址:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=327340&extra=page%3D1%26filter%3 ...

  8. linux系统优化 io,Linux硬件IO的优化简介

    首先简单介绍下有哪些硬件设备如下(由于硬件种类厂家等各种因素我就不在此多做介绍有兴趣的可以自行学习): 1.CPU:中央处理器,是计算机运算控制的核心部件之一,相当于人的大脑.如下图 2.RAM:内存 ...

  9. oracle临时表经常被锁_5.性能测试 - Oracle体系结构和性能优化简介

    体系结构 Oracle体系结构示意图 Oracle服务器: Oracle服务器是一个数据库管理系统,它为信息管理提供了开放.综合和集成的方法,包括Oracle实例和 Oracle数据库. Oracle ...

  10. oracle awr报告生成_5.性能测试 - Oracle体系结构和性能优化简介

    体系结构 Oracle体系结构示意图 Oracle服务器: Oracle服务器是一个数据库管理系统,它为信息管理提供了开放.综合和集成的方法,包括Oracle实例和 Oracle数据库. Oracle ...

最新文章

  1. e开头的正则 php,PHP正则表达式e模式
  2. android 相机纹理,Android平台Camera实时滤镜实现方法探讨(五)--GLSurfaceView实现Camera预览...
  3. python __init__ __new___Python中的__init__和__new__介绍
  4. 如何使用ABAP code inspector找出所有在LOOP里访问database的操作
  5. lsof -i:port 的作用
  6. DataList项模板中的div在后台得到方法
  7. RNN,LSTM中如何使用TimeDistributed包装层,代码示例
  8. python表白代码大全简单-程序员python表白代码
  9. 七夕动态表白代码,基于python
  10. Flutter 自定义CheckBox (用于兴趣爱好、风格选择)
  11. FPGA(二)---38译码器
  12. 如何更优雅地使用微博
  13. HDMI 之 HPD .
  14. 中石油布局天然气商储 天然气国家储备有望
  15. ps快速去掉图中的字
  16. 《华盛人》技术服务支持
  17. Android知识点-圆角
  18. 【java】《java编程思想》 读书笔记
  19. oracle导出一半报1046,Oracle 数据库1046事件
  20. A星算法(纯C实现)

热门文章

  1. mac抹掉磁盘重装系统未能与服务器取得联系_如何用U盘自制Mac笔记本系统重装盘...
  2. 斗罗大陆斗神再临服务器维修,斗罗大陆斗神再临攻略汇总:FAQ常见问题解答[多图]...
  3. PayPal接口开发
  4. 香农三大定理、香农公式
  5. linux进行挂载Nas存储
  6. Android动画定时lnvaliate,Android6.0 MTK6737 启动流程 · Younix’s Studio
  7. blender弯曲物体
  8. linux 编辑文件命令
  9. 2019-2021 文本生成图片 Text To Image(T2I) Synthesis 论文整理
  10. 一个让Google、Facebook、Amazon都羡慕的平台,为什么说阿里妈妈是数字营销的未来...