首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果打印值,Numba JIT更改结果

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

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

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

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

下面是我使用的代码:

代码语言:javascript
代码运行次数:0
运行
复制
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
运行
复制
array([[  0.,  nan,  nan],
       [  1.,   0.5,  nan],
       [  2.,   1.5,   1.],
       [  3.,   2.5,   2.],
       [  4.,   3.5,   3.]])

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

代码语言:javascript
代码运行次数:0
运行
复制
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 12:38:29

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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
运行
复制
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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档