Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果打印值,Numba JIT更改结果

如果打印值,Numba JIT更改结果
EN

Stack Overflow用户
提问于 2016-02-05 17:40:44
回答 1查看 694关注 0票数 4

我今天开始使用numba,主要是因为我有一个嵌套的for-循环,使用常规的python代码需要相当长的时间。

我有一个macports版本的python-2.7和llvm 3.6和pip版本的numba (一切都是最新的)。

下面是我使用的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
from numba import jit
from numpy import nan, full

@jit
def movingAverage(adj_close, maxMA):
    ma = full([len(adj_close), maxMA], nan, dtype=float64)
    ind = range( 1, len(adj_close)+1 )
    for d in ind:
        m = max( 0, d-maxMA-1)
        adj = adj_close[d-1:m:-1] if (m or d==maxMA+1) else adj_close[d-1::-1]
        cs = adj.cumsum()
        for i in range( len(adj) ):
            ma[d-1][i] = ( cs[i] / (i+1) )
        print ma
    return ma

我正在计算输入adj_close的滚动平均值,最多为maxMA天。

adj_close是一个值数组,每天一个值。

我从创建ma开始,它是要计算的值的持有者。并计算出每一天的计算值(注意,第一天的平均时间只能是1天,第二天,2天等等,直到maxMA)。

如果我输入像adj_close = array(range(5), dtype=float64)maxMA = 3这样的内容,得到正确的答案如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[  0.,  nan,  nan],
       [  1.,   0.5,  nan],
       [  2.,   1.5,   1.],
       [  3.,   2.5,   2.],
       [  4.,   3.5,   3.]])

但是,如果在函数返回之前取出print ma行,它只返回部分答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[ nan,  nan,  nan],
       [ nan,  nan,  nan],
       [ nan,  nan,  nan],
       [  3.,   2.5,   2.],
       [  4.,   3.5,   3.]])

为什么会发生这种事?为什么@jit需要这些循环之间的打印才能得到正确的答案?我能做些什么来摆脱print语句(这大大增加了运行时)?

编辑:我接受了@JoshAdel的建议,并在Numba的github上打开了一个问题。因此,我接受@MSeifert的回答,因为解决办法解决了我的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-06 04:38:29

我认为numba在这里做了一些奇怪的事情,但可能是因为pythonnopython模式的混合。如果我使用Python3.5,返回的结果与print相同,也不一样。

对于python2.7,我认为问题在于For -循环要么是在nopython模式下编译的(没有打印),要么是在python模式下编译的(带有打印)。但在退出循环时转换为python。但那只是猜测。但我试过了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
from numba import jit
from numpy import nan, full
import numpy as np

@jit
def movingAverage(adj_close, maxMA):
    ma = full([len(adj_close), maxMA], nan, dtype=np.float64)
    ind = range( 1, len(adj_close)+1 )
    for d in ind:
        m = max( 0, d-maxMA-1)
        adj = adj_close[d-1:m:-1] if (m or d==maxMA+1) else adj_close[d-1::-1]
        cs = adj.cumsum()
        for i in range( len(adj) ):
            ma[d-1][i] = ( cs[i] / (i+1) )
        if d == ind[-1]:
            return ma # notice that I return it after the last loop but before the loop terminates.
    #return ma

它确实回来了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[  0.,  nan,  nan],
       [  1.,   0.5,  nan],
       [  2.,   1.5,   1.],
       [  3.,   2.5,   2.],
       [  4.,   3.5,   3.]])

然而,由于len(adj_close)+1的重新计算,这并不是一种非常有效的方法。这个可能藏在某个地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35236352

复制
相关文章
Python实现GPU加速的基本操作
之前写过一篇讲述如何使用pycuda来在Python上写CUDA程序的博客。这个方案的特点在于完全遵循了CUDA程序的写法,只是支持了一些常用函数的接口,如果你需要自己写CUDA算子,那么就只能使用非常不Pythonic的写法。还有一种常见的方法是用cupy来替代numpy,相当于一个GPU版本的numpy。那么本文要讲述的是用numba自带的装饰器,来写一个非常Pythonic的CUDA程序。
DechinPhy
2021/09/08
3.2K0
Python实现GPU加速的基本操作
Python CUDA 编程 - 2 - Numba 简介
官方文档:http://numba.pydata.org/numba-doc/latest/reference/pysupported.html
为为为什么
2022/08/04
1.1K0
Python CUDA 编程 - 2 - Numba 简介
Python | 加一行注释,让你的程序提速10+倍!numba十分钟上手指南
之前的文章《源代码如何被计算机执行》已经提到计算机只能执行二进制的机器码,C、C++等编译型语言依靠编译器将源代码转化为可执行文件后才能运行,Python、Java等解释型语言使用解释器将源代码翻译后在虚拟机上执行。对于Python,由于解释器的存在,其执行效率比C语言慢几倍甚至几十倍。
PP鲁
2019/12/26
7.5K0
超过Numpy的速度有多难?试试Numba的GPU加速
Numpy是在Python中非常常用的一个库,不仅具有良好的接口文档和生态,还具备了最顶级的性能,这个库很大程度上的弥补了Python本身性能上的缺陷。虽然我们也可以自己使用Cython或者是在Python中调用C++的动态链接库,但是我们自己实现的方法不一定有Numpy实现的快,这得益于Numpy对于SIMD等技术的深入实现,把CPU的性能发挥到了极致。因此我们只能考虑弯道超车,尝试下能否用自己实现的GPU的算法来打败Numpy的实现。
DechinPhy
2021/08/31
2.4K0
超过Numpy的速度有多难?试试Numba的GPU加速
用 Numba 加速 Python 代码,变得像 C++ 一样快
注意: 这篇文章的 Jupyter Notebook 代码在我的 Github 上:SpeedUpYourAlgorithms-Numba
昱良
2019/07/04
2.7K0
用 Numba 加速 Python 代码,变得像 C++ 一样快
利用numba給Python代码加速 [1]
Numba @jit 装饰器有两种编译模式, Nopython 模式和Object 模式。nopython编译模式的行为本质上是编译修饰后的函数,使其完全运行而不需要Python解释器的参与。这是使用Numba jit装饰器的推荐和最佳实践方法,因为它可以获得最佳性能。@jit(nopython=True) 等效于@njit()。
用户6021899
2022/01/10
1.6K0
利用numba給Python代码加速 [1]
GPU加速02:超详细Python Cuda零基础入门教程,没有显卡也能学!
Python是当前最流行的编程语言,被广泛应用在深度学习、金融建模、科学和工程计算上。作为一门解释型语言,它运行速度慢也常常被用户诟病。著名Python发行商Anaconda公司开发的Numba库为程序员提供了Python版CPU和GPU编程工具,速度比原生Python快数十倍甚至更多。使用Numba进行GPU编程,你可以享受:
PP鲁
2019/12/26
6.8K0
GPU加速02:超详细Python Cuda零基础入门教程,没有显卡也能学!
python 性能的优化
NumPy的创始人Travis,创建了CONTINUUM,致力于将Python大数据处理方面的应用。 推出的Numba项目能够将处理NumPy数组的Python函数JIT编译为==机器码执行==,从而上百倍的提高程序的运算速度。
Tim在路上
2020/08/04
1.1K0
使用VBA自动更改Excel打印区域
在Excel中,将打印区域设置在移动单元格区域内可能是比较困难的事。你可能希望捕捉特定单元格区域为打印区域,或者让打印区域仅考虑某些列。假设在Excel工作簿中有几个辅助列,不希望打印这些列,但希望这些列可见。可以手动设置打印区域以排除非打印区域,但现在已经添加了更多数据,并且希望以同样的方式更新打印区域。
fanjy
2022/11/16
2.2K0
Python的GPU编程实例——近邻表计算
GPU加速是现代工业各种场景中非常常用的一种技术,这得益于GPU计算的高度并行化。在Python中存在有多种GPU并行优化的解决方案,包括之前的博客中提到的cupy、pycuda和numba.cuda,都是GPU加速的标志性Python库。这里我们重点推numba.cuda这一解决方案,因为cupy的优势在于实现好了的众多的函数,在算法实现的灵活性上还比较欠缺;而pycuda虽然提供了很好的灵活性和相当高的性能,但是这要求我们必须在Python的代码中插入C代码,这显然是非常不Pythonic的解决方案。因此我们可以选择numba.cuda这一解决方案,只要在Python函数前方加一个numba.cuda.jit的修饰器,就可以在Python中用最Python的编程语法,实现GPU的加速效果。
DechinPhy
2021/09/08
1.9K0
这一行代码,能让你的 Python 运行速度提高 100 倍!
python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。
杰哥的IT之旅
2020/09/30
6500
小案例:结果缓存无法使用,RESULT_CACHE_MAX_SIZE值无法更改的问题
最近遇到了一个 RESULT_CACHE_MAX_SIZE 参数值无法更改的问题。
SQLplusDB
2022/08/19
1.9K0
使用numba加速python科学计算
python作为一门编程语言,有非常大的生态优势,但是其执行效率一直被人诟病。纯粹的python代码跑起来速度会非常的缓慢,因此很多对性能要求比较高的python库,需要用C++或者Fortran来构造底层算法模块,再用python进行上层封装的方案。在前面写过的这篇博客中,介绍了使用f2py将fortran代码编译成动态链接库的方案,这可以认为是一种“事前编译”的手段。但是本文将要介绍一种即时编译(Just In Time,简称JIT)的手段,也就是在临近执行函数前,才对其进行编译。以下截图来自于参考链接4,讲述了关于常见的一些编译场景的区别:
DechinPhy
2021/05/21
2K0
让python快到飞起-numba加速
python是一门高效动态编程语言,由于其采用简洁明了的语法以及灵活性深受大家欢迎。但是,这既是它最大的优势,也是最大的劣势。它的灵活性和无类型的高级语法可能会导致数据和计算密集型程序的性能不佳,因为运行本地编译代码要比运行动态解释代码快很多倍。
自学气象人
2022/11/02
8950
让python快到飞起-numba加速
一行代码让你的python运行速度提高100倍
python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。
小小詹同学
2019/11/12
9070
numba,让你的Python飞起来!
python由于它动态解释性语言的特性,跑起代码来相比java、c++要慢很多,尤其在做科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显。
朱卫军 AI Python
2022/04/02
1.1K0
numba,让你的Python飞起来!
numba,让你的Python飞起来!
python由于它动态解释性语言的特性,跑起代码来相比java、c++要慢很多,尤其在做科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显。
Python进阶者
2019/09/17
1.3K0
numba,让你的Python飞起来!
Numba向量运算的强大
Hi! 大家好,又和大家见面了。上次给大家介绍了Numba中一句话加速for循环的@jit加速你的python脚本,今天继续给大家介绍另外一个我觉得很不错的Numba的用法。
阿凡亮
2020/04/14
1.2K0
[Python技巧]如何加快循环操作和Numpy数组运算速度
在 24式加速你的Python中介绍对循环的加速方法中,一个办法就是采用 Numba 加速,刚好最近看到一篇文章介绍了利用 Numba 加速 Python ,文章主要介绍了两个例子,也是 Numba 的两大作用,分别是加速循环,以及对 Numpy 的计算加速。
kbsc13
2019/08/16
10K0
点击加载更多

相似问题

Numba jit和Scipy

14

动态编译numba jit

10

如何使numba @jit使用所有cpu内核(并行化numba @jit)

23

Python numba.jit类型

11

Numba jit和延迟类型

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文