Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >利用numba給Python代码加速 [2]

利用numba給Python代码加速 [2]

作者头像
用户6021899
发布于 2022-01-10 00:09:09
发布于 2022-01-10 00:09:09
91700
代码可运行
举报
运行总次数:0
代码可运行
  • @vectorize 装饰器

Numba 的 @vectorize 装饰器可以将以标量为输入的的python函数编译为类似Numpy的 ufuncs。创建一个传统的NumPy ufunc并不是最简单的过程,它可能需要编写一些C代码。Numba让这很容易。使用@vectorize装饰器 ,Numba可以将纯Python函数编译成ufunc,该ufunc在NumPy数组上运行的速度与用C编写的传统ufunc一样快。

一个简单的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
from numba import vectorize, float64

@vectorize(nopython=True)
def f(x, y):
    return x + y

a = np.arange(1,11)
b = np.arange(10,0,-1)
print(f(a,b))

以上是惰性编译,不指定参数类型。也可以采用积极编译,给出函数签名,即指定返回值和输入参数的类型。注意函数签名需写在列表中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@vectorize([float64(float64, float64)], nopython=True)
def f(x, y):
    return x + y

还可以指定多个函数签名,需注意越通用的类型越要排在后面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
from numba import vectorize, int32, int64, float32, float64

@vectorize([int32(int32, int32),
            int64(int64, int64),
            float32(float32, float32),
            float64(float64, float64)])
def f(x, y):

return x + y

此时如果传入其它类型,程序就会报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> a = np.linspace(0, 1+1j, 6)
>>> f(a, a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ufunc 'ufunc' not supported for the input types, and the 
inputs could not be safely coerced to any supported types according
to the casting rule ''safe''
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
你可能会问,为什么不之间用@jit装饰器写一个简单的循环来替代呢?
答案是NumPy UFUNC会自动获得其他功能,如 reduce,accumulate或
广播。

a = np.arange(12).reshape(3, 4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> f.reduce(a, axis=0) # 按行求和合并
array([12, 15, 18, 21])
>>> f.reduce(a, axis=1) # 按列求和合并
array([ 6, 22, 38])

>>> f.accumulate(a) # 按行积累
array([[ 0,  1,  2,  3],
       [ 4,  6,  8, 10],
       [12, 15, 18, 21]])
>>> f.accumulate(a, axis=1) # 按列积累
array([[ 0,  1,  3,  6],
       [ 4,  9, 15, 22],
       [ 8, 17, 27, 38]])

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
利用numba給Python代码加速 [1]
Numba @jit 装饰器有两种编译模式, Nopython 模式和Object 模式。nopython编译模式的行为本质上是编译修饰后的函数,使其完全运行而不需要Python解释器的参与。这是使用Numba jit装饰器的推荐和最佳实践方法,因为它可以获得最佳性能。@jit(nopython=True) 等效于@njit()。
用户6021899
2022/01/10
1.6K0
利用numba給Python代码加速 [1]
利用numba給Python代码加速 [3]
vectorize()允许您编写一次只能处理一个元素的UFUNC,但guvectorize()装饰器将这一概念更进一步,允许您编写可以处理任意数量的输入数组元素的UFUNC,并获取和返回不同维度的数组。
用户6021899
2022/03/04
4720
利用numba給Python代码加速 [3]
《利用Python进行数据分析·第2版》 附录A NumPy高级应用A.1 ndarray对象的内部机理A.2 高级数组操作A.3 广播A.4 ufunc高级应用A.5 结构化和记录式数组A.6 更多
在这篇附录中,我会深入NumPy库的数组计算。这会包括ndarray更内部的细节,和更高级的数组操作和算法。 这章包括了一些杂乱的章节,不需要仔细研究。 A.1 ndarray对象的内部机理 NumPy的ndarray提供了一种将同质数据块(可以是连续或跨越)解释为多维数组对象的方式。正如你之前所看到的那样,数据类型(dtype)决定了数据的解释方式,比如浮点数、整数、布尔值等。 ndarray如此强大的部分原因是所有数组对象都是数据块的一个跨度视图(strided view)。你可能想知道数组视图arr[
SeanCheney
2018/04/24
4.9K0
《利用Python进行数据分析·第2版》 附录A NumPy高级应用A.1 ndarray对象的内部机理A.2 高级数组操作A.3 广播A.4 ufunc高级应用A.5 结构化和记录式数组A.6 更多
用 Numba 加速 Python 代码,变得像 C++ 一样快
注意: 这篇文章的 Jupyter Notebook 代码在我的 Github 上:SpeedUpYourAlgorithms-Numba
昱良
2019/07/04
2.8K0
用 Numba 加速 Python 代码,变得像 C++ 一样快
利用numba給Python代码加速 [0]
Numba 利用LLVM将python函数编译成优化后的机器码。Numba编译的由python写的数学算法能够接近C或Fortran的运行速度。LLVM 不仅能编译numba代码,还擅长优化它。
用户6021899
2021/12/30
3580
利用numba給Python代码加速 [0]
Python 提速大杀器之 numba 篇
你是不是曾经有这样的苦恼,python 真的太好用了,但是它真的好慢啊(哭死) ; C++ 很快,但是真的好难写啊,此生能不碰它就不碰它。老天啊,有没有什么两全其美的办法呢?俗话说的好:办法总是比困难多,大家都有这个问题,自然也就有大佬来试着解决这个问题,这就请出我们今天的主角: numba
OpenMMLab 官方账号
2022/01/18
3K0
NumPy学习笔记—(1/3)
想要有效的掌握数据驱动科学和计算需要理解数据是如何存储和处理的。本节将描述和对比数组在 Python 语言中和在 NumPy 中是怎么处理的,NumPy 是如何优化了这部分的内容。
可以叫我才哥
2021/08/05
1.5K0
numba,让你的Python飞起来!
python由于它动态解释性语言的特性,跑起代码来相比java、c++要慢很多,尤其在做科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显。
派大星的数据屋
2022/04/02
1.2K0
numba,让你的Python飞起来!
numba,让你的Python飞起来!
python由于它动态解释性语言的特性,跑起代码来相比java、c++要慢很多,尤其在做科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显。
Python进阶者
2019/09/17
1.3K0
numba,让你的Python飞起来!
【Python】小谈numpy数组占用内存空间问题
该文介绍了利用Python的Numpy库,对数组对象进行压缩、解压缩的方法,并举例进行测试。同时,也介绍了Numpy库中各种类型对象所占用的空间大小。
Alan Lee
2018/01/02
3.7K0
深度学习-TensorFlow张量和常用函数
在tf.random.truncated_normal中如果随机数的取值在(u-2\sigma, u+2\sigma)之外,则重新生成,保证值在均值附近
皮大大
2023/08/25
4730
灰太狼的数据世界(一)
数据的世界是新奇的,美妙的。但是如果你对它不感兴趣,那它就是一个枯燥无趣的东西了。
我被狗咬了
2019/09/23
1K0
灰太狼的数据世界(一)
Numba向量运算的强大
Hi! 大家好,又和大家见面了。上次给大家介绍了Numba中一句话加速for循环的@jit加速你的python脚本,今天继续给大家介绍另外一个我觉得很不错的Numba的用法。
阿凡亮
2020/04/14
1.2K0
使用numba加速python科学计算
python作为一门编程语言,有非常大的生态优势,但是其执行效率一直被人诟病。纯粹的python代码跑起来速度会非常的缓慢,因此很多对性能要求比较高的python库,需要用C++或者Fortran来构造底层算法模块,再用python进行上层封装的方案。在前面写过的这篇博客中,介绍了使用f2py将fortran代码编译成动态链接库的方案,这可以认为是一种“事前编译”的手段。但是本文将要介绍一种即时编译(Just In Time,简称JIT)的手段,也就是在临近执行函数前,才对其进行编译。以下截图来自于参考链接4,讲述了关于常见的一些编译场景的区别:
DechinPhy
2021/05/21
2K0
NumPy学习笔记(一)
# NumPy ### 安装 - 通过安装Anaconda安装NumPy,一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,包含了大量的科学计算相关的包,其中就包括NumPy - 通过pip安装, - 在windows中,控制台中输入命令安装 ```python >pip install numpy ``` - 在ubuntu中,控制台输入命令安装 ```python XXX:~/Desktop$sud
py3study
2020/01/17
6100
NumPy Essentials 带注释源码 三、NumPy 数组使用
# 来源:NumPy Essentials ch3 向量化 import numpy as np # NumPy 数组的运算是向量化的 # 数组和标量运算是每个元素和标量运算 x = np.array([1, 2, 3, 4]) x + 1 # array([2, 3, 4, 5]) # 数组和数组运算是逐元素运算 y = np.array([-1, 2, 3, 0]) x * y array([-1, 4, 9, 0]) # 需要计算内积的时候 # 使用np.dot np
ApacheCN_飞龙
2019/02/15
8040
NumPy 1.26 中文官方指南(一)
NumPy 是 Python 中科学计算的基础包。 这是一个提供多维数组对象、各种派生对象(如掩码数组和矩阵)以及一系列用于数组快速操作的例程的 Python 库,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等。
ApacheCN_飞龙
2024/04/26
1.3K0
NumPy 1.26 中文官方指南(一)
4-Numpy通用函数
计算这百万个操作并存储结果需要几秒钟!甚至现在的手机的处理速度都以Giga-FLOPS衡量时(即每秒数十亿次数字运算)。 不过事实证明,这里的瓶颈不是操操作系统作本身,而是CPython在循环的每个循环中必须执行的类型检查和函数分派。 每次计算倒数时,Python都会首先检查对象的类型,并动态查找要用于该类型的正确函数。如果我们使用的是已编译的代码(静态语言的优势),则在代码执行之前便会知道此类型规范,并且可以更有效地计算结果。
用户1418372
2020/03/20
8720
Numpy 之ufunc运算
ufunc是universal function的缩写,它是一种能对数组的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的,因此它们的计算速度非常快。让我们来看一个例子:
用户6021899
2019/08/14
1.4K0
强化学习技巧五:numba提速python程序
numba是一款可以将python函数编译为机器代码的JIT编译器,经过numba编译的python代码(仅限数组运算),其运行速度可以接近C或FORTRAN语言。
汀丶人工智能
2022/12/21
1K0
强化学习技巧五:numba提速python程序
相关推荐
利用numba給Python代码加速 [1]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验