添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Python的多重for循环可以用什么办法克服其速度慢的缺陷(numba@jit除外)?

最近在回看自己之前打的代码,发觉一份项目里的Python代码里面,有一个三重循环十分耗时间,使用numba的话提升效果并不明显,想问问大家如何去解决。大家一起来讨论下吧~

这个循环是在迭代的更新两个矩阵内元素,算法内的迭代并不支持用矩阵思想来批量处理,从而达到加速的目的。

Reply

现在问题算是解决了,自己来回答一波~

我的原先的函数内容大概是这样的:
原代码
解释一下:

#1的语句是一些有关于初始化的操作。
#update equations 大概是一个迭代更新L和R数组某元素的东西,但这种迭代不支持用一些Py的技巧来让它进行批量的处理。

那么问题出在哪儿了呢?

numba@jit其实是不支持list语句的!!! 而在#1语句里面写到了一些必须要用的list操作。所以我在notebook上跑的时候一直会报WARNING通知的,然而愚蠢的我在当时忽略了它的存在。

所以在那时,看似我加了@jit做修饰器,但其实 并没有 !!!

于是乎,一个比较显然的重构的想法就出来了。

跑通了之后,虽然还是比C++慢,但速度已经不会像当时一样不可容忍了。

关于其它的for内加速的方法:

  • @jit不说了,简单方便的一种方法,但是不支持list操作。
  • 少在循环内调用大复杂度的函数。
  • 然后cython,但可能需要重构代码之类的。
  • 或者PyPy,但它是不支持numpy相关的东西的。
  • 最后的最后,尽量做批量处理,充分发挥Py和numpy的优势!

最后吐槽一句,要不是必须用DL,我才**不用Python呢…

今天聊聊Python 3.0的Numba库的即时编译@jit(Just in Time)。故事背景:知乎某小透明提出的一个问题Python的多重for循环可以用什么办法克服其速度慢的缺陷(numba@jit除外)?最近在回看自己之前打的代码,发觉一份项目里的Python代码里面,有一个三重循环十分耗时间,使用numba的话提升效果并不明显,想问问大家如何去解决。大家一起来讨论下吧~这个循环是在迭代的更新两个矩阵内元素,算法内的迭代并不支持用矩阵思想来批量处理,从而达到加速的目的。Reply现在
对于某个城市的出租车数据,一天就有33210000条记录,如何将每辆车的数据单独拎出来放到一个专属的文件中呢? 思路很简单: 就是 循环 33210000条记录,将每辆车的数据搬运到它该去的文件中。 但是对于3000多万条数据,一个一个 循环 太消耗时间,我花了2个小时才搬运了60万数据,算算3000万我需要花费100个小时,也就需要4-5天。并且还需要保证这五天全天开机,不能出现卡机的事故。 因此,需要...
conda伪造 该软件包包含一些执行Quaternion操作的 numba - jit 编译函数以及一个方便的类Quaternion ,该类Quaternion提供了包装这些函数的便捷 方法 。 Quaternion行为就像含有四元一numpy的阵列,例如尊重numpy的广播操作,但没有真正模仿numpy.ndarray并实施了dtype 。 通过这种设计,您可以编写涉及提供的 jit 编译函数的任何 jit 编译函数,然后编写自己的类 方法 ,以方便的方式调用这些函数(通过类继承)。 如果您不希望在编写的其他 Jit 编译函数中使用四元数,请查看以下软件包。 我知道并使用过的其他实现四元数的 Python 项目是: :使用Numpy以纯 Python 编写。请注意,它们通常将真实
前情提要: python 在处理高时间复杂度的双重for 循环 时候效率低,而多线程又不适合于计算密集的任务提速。昨天睡之前让电脑自己运行17000*17000的计算,结果跑了19000秒。 因此尝试寻求为 python 提速的解决方案。在那之前,我们先了解一下,为什么 python 这么慢??? python 为啥这么慢 首先可以了解 python 的运行原理,以下总结都来自于右边链接–> Linkkkkkkkkkkkk1,Linkkkkkkkkkk2, Linkkkkkkkkkkk3 python 将py文件视为一个module, python 的解释器在执行模块的时候将其编译成字节码对象 PyCodeObject,
利用内置函数:使用内置函数可以 加速 代码的执行,例如 map() 和 filter()。 避免不必要的 循环 :如果可以直接使用列表推导式或生成器表达式代替 for 循环 ,则应该使用它们。 利用预先计算:如果可以预先计算某些值,则应该尽量预先计算。 减少 循环 次数:应该尽量减少 循环 的次数,例如,使用 while 循环 代替 for 循环 numba Numba 通过及时编译机制( JIT )优化 Python 代码, Numba 可以针对本机的硬件环境进行优化,同时支持CPU和GPU的优化,并且可以和Numpy集成,使 Python 代码可以在GPU上运行,只需在函数上方加上相关的指令标记, 如下所示: import numpy as np from timeit import default_timer as timer from numba impor
包含5个文件适用于64位windows系统中 python 安装 numba 加速 1 pyphon 3.7 已经安装,且pycharm也已经安装 2 安装vs2015/2017/2019均可,然后运行VC 3 将上述whl文件运用批评分别安装,顺序依次为numpy、llvm、 numba 、import 4 至此在pycharm中file-setting-project-interpreter中可以看到所有已经都安装 5 安装完成,网上找使用 方法
Numba Python compiler for NumPy/SciPyPyCon 2012. Santa Clara, CA, USA. March 10, 2012Monday, March 12, 12NumPy Users• Want to be able to write Python to get fast code that works on arrays and scalars • Need access to a boat-load of C-extensions(NumPy is just the beginning)PyPy doesn’t cut it for us!Monday, March 12, 12Dynamic compilation Python FunctionNumPy RuntimeU edUFu ncsFu xingM ryFilt ilter
对于某个城市的出租车数据,一天就有33210000条记录,如何将每辆车的数据单独拎出来放到一个专属的文件中呢? 思路很简单: 就是 循环 33210000条记录,将每辆车的数据搬运到它该去的文件中。 但是对于3000多万条数据,一个一个 循环 太消耗时间,我花了2个小时才搬运了60万数据,算算3000万我需要花费100个小时,也就需要4-5天。并且还需要保证这五天全天开机,不能出现卡机的事故。 因此,需要使用并行进行for 循环 的技巧: 由于3000万数据放到csv中导致csv打不开,因此我就把一个csv通过split软件将其切分成每份60万,共53个csv。 我原来的思路是读取文件夹,获取由每一个60
Python 在处理高时间复杂度的双重for 循环 时效率较低的原因有以下几点: 1. 解释型语言: Python 是一种解释型语言,每行代码都需要被解释器逐行执行,相比编译型语言,执行效率较低。 2. 全局解释器锁(GIL): Python 的全局解释器锁限制了同一时间只能有一个线程执行 Python 字节码,这导致多线程在计算密集型任务上无法充分利用多核处理器的优势。 3. 动态类型: Python 是一种动态类型语言,变量的类型在运行时才确定,这增加了解释器的负担和执行时间。 4. 内存管理: Python 的内存管理机制也会对性能产生一定的影响。 为了提高 Python 双重for 循环 的执行效率,可以考虑以下几种解决方案: 1. 使用NumPy库:NumPy是 Python 的一个科学计算库,它提供了高性能的多维数组对象和相应的计算函数,可以用来替代 Python 的双重for 循环 ,从而提高计算效率。 2. 使用并行计算库:可以使用并行计算库(如multiprocessing、concurrent.futures等)将任务分配给多个进程或线程并行执行,从而充分利用多核处理器的优势。 3. 使用Cython或 JIT 编译器:可以使用Cython将 Python 代码转换为C语言代码,或使用即时编译器(如PyPy)来提高执行效率。 4. 优化算法:对于复杂的计算任务,可以考虑优化算法,减少计算量或改进计算 方法 ,从而提高执行效率。