1. 首页
  2. 未分类

python可以提高程序执行速度N倍你知道吗?

“u003Cdivu003Eu003Cpu003Eu003Cstrongu003E1.1 Numba的约5分钟指南u003Cu002Fstrongu003Eu003Cbru003ENumba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码。使用Numba的最常用方法是通过其装饰器集合,可以应用于您的函数来指示Numba编译它们。当调用Numba修饰函数时,它被编译为机器代码“及时”执行,并且您的全部或部分代码随后可以以本机机器代码速度运行!u003Cu002Fpu003Eu003Cpu003E开箱即用的Numba使用以下方法:u003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003E操作系统:Windows(32位和64位),OSX和Linux(32位和64位)u003Cu002Fliu003Eu003Cliu003E架构:x86,x86_64,ppc64le。在armv7l,armv8l(aarch64)上进行实验。u003Cu002Fliu003Eu003Cliu003EGPU:Nvidia CUDA。AMD ROC的实验。u003Cu002Fliu003Eu003Cliu003ECPython的u003Cu002Fliu003Eu003Cliu003ENumPy 1.10 – 最新u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F5eb4f04ce8fd4f67b0323284a5ef0753″ img_width=”300″ img_height=”227″ alt=”python可以提高程序执行速度N倍你知道吗?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003Eu003Cstrongu003E1.1.1 我怎么得到它?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003ENumba可作为畅达包为 蟒蛇Python发布:u003Cu002Fpu003Eu003Cpu003ENumba还有pip可供选择:u003Cu002Fpu003Eu003Cpu003ENumba也可以 从源代码编译,虽然我们不建议首次使用Numba用户。u003Cu002Fpu003Eu003Cpu003ENumba通常用作核心包,因此其依赖性保持在绝对最小值,但是,可以按如下方式安装额外的包以提供其他功能:u003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003Escipy- 支持编译numpy.linalg功能。u003Cu002Fliu003Eu003Cliu003Ecolorama – 支持回溯u002F错误消息中的颜色突出显示。u003Cu002Fliu003Eu003Cliu003Epyyaml – 通过YAML配置文件启用Numba配置。u003Cu002Fliu003Eu003Cliu003Eicc_rt – 允许使用Intel SVML(高性能短矢量数学库,仅限x86_64)。安装说明在性能提示中。u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E1.1.2 Numba会为我的代码工作吗?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E这取决于你的代码是什么样的,如果你的代码是以数字为导向的(做了很多数学运算),经常使用NumPy和u002F或有很多循环,那么Numba通常是一个不错的选择。在这些例子中,我们将应用最基本的Numba的JIT装饰器,@jit试图加速一些函数来演示哪些有效,哪些无效。u003Cu002Fpu003Eu003Cpu003ENumba在代码看起来像这样:u003Cu002Fpu003Eu003Cpu003E对于看起来像这样的代码,如果有的话,它将无法正常工作:u003Cu002Fpu003Eu003Cpu003E请注意,Numba不理解Pandas,因此Numba只是通过解释器运行此代码,但增加了Numba内部开销的成本!u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fdcd8beadd2cd4e10b2943655e5fdcddf” img_width=”368″ img_height=”361″ alt=”python可以提高程序执行速度N倍你知道吗?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003Eu003Cstrongu003E1.1.3 什么是nopython模式?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003ENumba @jit装饰器从根本上以两种编译模式运行, nopython模式和object模式。在go_fast上面的例子中, nopython=True在@jit装饰器中设置,这是指示Numba在nopython模式下操作。nopython编译模式的行为本质上是编译装饰函数,以便它完全运行而不需要Python解释器的参与。这是使用Numba jit装饰器的推荐和最佳实践方式,因为它可以带来最佳性能。u003Cu002Fpu003Eu003Cpu003E如果编译nopython模式失败,Numba可以编译使用 ,如果没有设置,这是装饰器的 后退模式(如上例所示)。在这种模式下,Numba将识别它可以编译的循环并将它们编译成在机器代码中运行的函数,并且它将运行解释器中的其余代码。为获得最佳性能,请避免使用此模式objectmode@jitnopython=Trueuse_pandasu003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E1.1.4 如何衡量Numba的表现?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E首先,回想一下,Numba必须为执行函数的机器代码版本之前给出的参数类型编译函数,这需要时间。但是,一旦编译完成,Numba会为所呈现的特定类型的参数缓存函数的机器代码版本。如果再次使用相同的类型调用它,它可以重用缓存的版本而不必再次编译。u003Cu002Fpu003Eu003Cpu003E测量性能时,一个非常常见的错误是不考虑上述行为,并使用一个简单的计时器来计算一次,该计时器包括在执行时编译函数所花费的时间。u003Cu002Fpu003Eu003Cpu003E例如:u003Cu002Fpu003Eu003Cpu003E这,例如打印:u003Cu002Fpu003Eu003Cpu003E衡量Numba JIT对您的代码的影响的一个好方法是使用timeit模块函数来执行时间,这些函数测量多次执行迭代,因此可以在第一次执行时适应编译时间。u003Cu002Fpu003Eu003Cpu003E作为旁注,如果编译时间成为问题,Numba JIT支持 编译函数的磁盘缓存,并且还具有Ahead-Of-Time编译模式。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E1.1.5 它有多快?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E假设Numba可以在nopython模式下运行,或者至少编译一些循环,它将针对您的特定CPU进行编译。加速因应用而异,但可以是一到两个数量级。Numba有一个 性能指南,涵盖了获得额外性能的常用选项。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E1.1.6 Numba如何运作?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003ENumba读取装饰函数的Python字节码,并将其与有关函数输入参数类型的信息相结合。它分析并优化您的代码,最后使用LLVM编译器库生成函数的机器代码版本,根据您的CPU功能量身定制。每次调用函数时都会使用此编译版本。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E1.1.7 其他感兴趣的东西:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003ENumba有相当多的装饰,我们看到@jit和@njit,但也有:u003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003E@vectorize- 生成NumPy ufunc(ufunc支持所有方法)。文件在这里。u003Cu002Fliu003Eu003Cliu003E@guvectorize- 产生NumPy广义ufuncs。 文件在这里。u003Cu002Fliu003Eu003Cliu003E@stencil – 将函数声明为类似模板操作的内核。 文件在这里。u003Cu002Fliu003Eu003Cliu003E@jitclass – 对于jit感知类。文件在这里。u003Cu002Fliu003Eu003Cliu003E@cfunc – 声明一个函数用作本机回调(从C u002F C ++等调用)。文件在这里。u003Cu002Fliu003Eu003Cliu003E@overload- 注册您自己的函数实现,以便在nopython模式下使用,例如@overload(scipy.special.j0)。 文件在这里。u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E一些装饰者提供额外选项:u003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003Eparallel = True- 启用功能的 自动并行化。u003Cu002Fliu003Eu003Cliu003Efastmath = True- 为该功能启用快速数学行为。u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Ectypes u002F cffi u002F cython互操作性:u003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003Ecffi- 模式支持调用CFFI函数nopython。u003Cu002Fliu003Eu003Cliu003Ectypes- 模式支持调用ctypes包装函数nopython。。u003Cu002Fliu003Eu003Cliu003ECython导出的函数是可调用的。u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E1.1.7.1 GPU目标:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003ENumba可以针对Nvidia CUDA和(实验性)AMD ROC GPU。您可以使用纯Python编写内核,让Numba处理计算和数据移动(或明确地执行此操作)。单击关于CUDA或ROC的 Numba文档 。u003Cu002Fpu003Eu003Cpu003E示例:接下来我们写一段简单的代码,来计算一下执行时间:u003Cu002Fpu003Eu003Cpu003E示例1:不使用numba的:u003Cu002Fpu003Eu003Cpu003E示例输出时间:u003Cu002Fpu003Eu003Cpu003E示例2:使用numba @jitu003Cu002Fpu003Eu003Cpu003E示例输出:u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E结论:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E上述两个示例代码,一个使用了numba,另一个没有使用numba;可以看出使用numba @jit装饰后,时间明显快了很多倍。u003Cu002Fpu003Eu003Cpu003E这只是一个简单示例;对于复杂计算提高速度更明显。u003Cu002Fpu003Eu003Cpu003E最后,小编想说:我是一名python开发工程师,整理了一套最新的python系统学习教程,想要这些资料的可以关注私信小编“01”即可,希望能对你有所帮助u003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:python可以提高程序执行速度N倍你知道吗?

主题测试文章,只做测试使用。发布者:熱鬧獨處,转转请注明出处:http://www.cxybcw.com/18131.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code