强化学习技巧五:numba提速python程序(代码片段)

汀、 汀、     2022-12-04     761

关键词:

numba是一款可以将python函数编译为机器代码的JIT编译器,经过numba编译的python代码(仅限数组运算),其运行速度可以接近C或FORTRAN语言。

numba使用情况

  • 使用numpy数组做大量科学计算时
  • 使用for循环时

1.numba使用

导入numpy、numba及其编译器

import numpy as np
import numba
from numba import jit

传入numba装饰器jit,编写函数

# 使用numba的情况
@jit(nopython=True)
def t():
    x = 0
    for i in np.arange(5000):
        x += i
    return x
%timeit(t())

nopython = True选项要求完全编译该函数(以便完全删除Python解释器调用),否则会引发异常。这些异常通常表示函数中需要修改的位置,以实现优于Python的性能。强烈建议您始终使用nopython = True。

2.不适用场景

numba目前只支持Python原生函数和部分Numpy函数,其他场景下无效。

from numba import jit
import pandas as pd

x = 'a': [1, 2, 3], 'b': [20, 30, 40]

@jit
def use_pandas(a): # Function will not benefit from Numba jit
    df = pd.DataFrame.from_dict(a) # Numba doesn't know about pd.DataFrame
    df += 1                        # Numba doesn't understand what this is
    return df.cov()                # or this!

print(use_pandas(x))

上述代码中使用了Pandas,而Pandas并不是原生代码,而是更高层次的封装,Numba不能理解pandas内部在做什么,所以无法对其加速。

而一些常用的机器学习框架,比如scikit-learn, tensorflow, pyrorch等,已经做了大量的优化,不适合再使用Numba做加速。

可以简单总结为,Numba不支持:

  • pandas

  • scikit-learn, tensorflow, pyrorch

  • try…except 异常处理

  • with 语句

  • yield from

Numba有两种模式:

@jit:object模式:上图左侧
Numba的@jit装饰器会尝试优化代码,如果发现不支持(比如pandas等),那么Numba会继续使用Python原来的方法去执行该函数。

@jit(nopython=True)或者@njit:nopython模式:上图右侧
强制加速,不会进入上图左侧流程,只进行右侧流程,如果编译不成功,就抛出异常。
 

 Numba使用了LLVMNVVM技术,此技术将Python等解释型语言直接翻译成CPUGPU可执行的机器码

那如何决定是否使用Numba呢?

Numba的@jit装饰器就像自动驾驶,用户不需要关注到底是如何优化的,Numba去尝试进行优化,如果发现不支持,那么Numba会继续用Python原来的方法去执行该函数,即图 Python解释器工作原理中左侧部分。这种模式被称为object模式。前文提到的pandas的例子,Numba发现无法理解里面的内容,于是自动进入了object模式。object模式还是和原生的Python一样慢,还有可能比原来更慢。

Numba真正牛逼之处在于其nopython模式。将装饰器改为@jit(nopython=True)或者@njit,Numba会假设你已经对所加速的函数非常了解,强制使用加速的方式,不会进入object模式,如编译不成功,则直接抛出异常。nopython的名字会有点歧义,我们可以理解为不使用很慢的Python,强制进入图 Python解释器工作原理中右侧部分。

实践上,一般推荐将代码中计算密集的部分作为单独的函数提出来,并使用nopython方式优化,这样可以保证我们能使用到Numba的加速功能。其余部分还是使用Python原生代码,在计算加速的前提下,避免过长的编译时间。(有关编译时间的问题下节将会介绍。)Numba可以与NumPy紧密结合,两者一起,常常能够得到近乎C语言的速度。尽管Numba不能直接优化pandas,但是我们可以将pandas中处理数据的for循环作为单独的函数提出来,再使用Numba加速。

几个压箱底的tips,python提速不是一点点(代码片段)

点击机器学习算法与Python学习,选择加星标精彩内容不迷路本文对一些Python代码加速运行的技巧进行整理。0.代码优化原则本文会介绍不少的Python代码加速运行的技巧。在深入代码优化细节之前,需要了解一些代码优化基... 查看详情

几个压箱底的tips,python提速不是一点点(代码片段)

点击机器学习算法与Python学习,选择加星标精彩内容不迷路本文对一些Python代码加速运行的技巧进行整理。0.代码优化原则本文会介绍不少的Python代码加速运行的技巧。在深入代码优化细节之前,需要了解一些代码优化基... 查看详情

1个gpu几分钟搞定强化学习训练,谷歌新引擎让深度学习提速1000倍丨开源

...itAI机器人要如何完成这样一个动作?我们一般会基于强化学习,在仿真环境中进行模拟训练。这时,如果在一台机器的CPU环境下进行模拟训练,那么需要几个小时到几天。但现在,只需一个TPU/GPU,就能和... 查看详情

python学习第五十四天:作用域对象与运用技巧(代码片段)

1.JS作用域1.1全局作用域和局部作用域函数外面声明的就是全局作用域函数内是局部作用域全局变量可以直接在函数内修改和使用变量,使用var是声明,没有var是使用变量。如果在函数内使用var来声明变量,在函数内会覆盖同名... 查看详情

强化学习调参技巧二:ddpgtd3sac算法为例:

1.训练环境如何正确编写强化学习里的env.reset()env.step()就是训练环境。其编写流程如下:1.1初始阶段:先写一个简化版的训练环境。把任务难度降到最低,确保一定能正常训练。记录正常训练的智能体的分数,与随机动作、传统... 查看详情

强化学习调参技巧:ddpgtd3sac算法为例:(代码片段)

1.训练环境如何正确编写强化学习里的env.reset()env.step()就是训练环境。其编写流程如下:1.1初始阶段:先写一个简化版的训练环境。把任务难度降到最低,确保一定能正常训练。记录正常训练的智能体的分数,与随机动作、传统... 查看详情

python爬虫提速小技巧,多线程与多进程(附源码示例)(代码片段)

目录前言一、线程与进程1.1进程(Process)1.2线程(Thread)1.3小结二、Threading模块2.1创建多线程2.1.1直接调用2.1.2继承调用(推荐使用)2.2多线程传参2.2.1直接调用传参2.2.2继承调用传参(推荐使用)2.... 查看详情

赠书|干货!用python动手学强化学习

01了解强化学习新闻报道中很少将强化学习与机器学习、深度学习、人工智能这些关键词区分开来,所以我们要先介绍什么是强化学习,再讲解其基本机制。强化学习与机器学习、人工智能这些关键词之间的关系;强... 查看详情

python强化学习(代码片段)

查看详情

强化学习资料汇总

网上关于强化学习的资料很多,这里对一些比较有价值的资料进行汇总,包括书籍、课程、博客以及论文,并且会持续更新。书籍ReinforcementLearning:AnIntroduction.RichardS.SuttonandAndrewG.Barto.2017.这是一本经典的强化学习入门... 查看详情

强化学习调参技巧一:ddpg算法训练动作选择边界值_分析解决

1.原因:选择动作值只在-11之间取值actor网络输出用tanh,将动作规范在[-1,1],然后线性变换到具体的动作范围。其次,tanh激活区是有范围的,你的预激活变量(输入tanh的)范围太大,进入了tanh的饱... 查看详情

Numba 中的稀疏矩阵

...述】:我希望使用Numba(http://numba.pydata.org/)加速我的机器学习算法(用Python编写)。请注意,该算法将稀疏矩阵作为其输入数据。在我的纯Python实现中,我使用了来自Scipy的csr_matrix和相关类,但显然它与Numba的JIT编译器不兼容。我... 查看详情

深度盘点:python7种提效增速的技巧(代码片段)

...速优化问题,本文就为大家介绍几种Python常用的提速技巧。优化原则:1.先保证代码可以正确运行,再进行性能优化2.优化的选择通常是牺牲空间换取时间,所有我们需要权衡代价3.着重优化代码耗时的部分,... 查看详情

如何更新 keras 中的权重以进行强化学习?

】如何更新keras中的权重以进行强化学习?【英文标题】:Howtoupdateweightsinkerasforreinforcementlearning?【发布时间】:2017-02-1811:24:28【问题描述】:我正在从事强化学习计划,我将这篇文章用作reference。我正在使用带有keras(theano)的pyth... 查看详情

强化学习步骤

1.Python基础(莫烦)2.数据分析的视频:Numpy,Matplotlib,Pandas(已发链接)3.强化学习基础(莫烦) B站4.强化学习理论课(silver)5.QLearning 查看详情

深度强化学习deepreinforcementlearning学习过程流水账

...骚。 Python怎么学上手快,够用?神经网络怎么上手?强化学习怎么上手? 目标驱动,先去看用Python写的强化学习的代码,再去看一些实现各种神经网络的Python代码。再看两种融合的代码。熟悉工作环境和工作所用工具,... 查看详情

什么是强化学习?

摘要:本文尝试以一种通俗易懂的形式对强化学习进行说明,将不会包含一个公式。本文分享自华为云社区《强化学习浅述》,作者:yanghuaili人。机器学习可以大致分为三个研究领域:监督学习,无监督学习和强化学习(Reinforc... 查看详情

强化学习学习资料汇总

python机器学习四(强化学习)DQN算法流程https://www.jianshu.com/p/42507aa63b05/https://www.jianshu.com/p/42507aa63b05/基于深度强化学习的智能体系结构参数调优基于深度强化学习的智能体系结构参数调优-知乎CAPES(ComputerAutomatedPerformanceEnhancementSystem... 查看详情