我今天开始使用numba,主要是因为我有一个嵌套的for-循环,使用常规的python代码需要相当长的时间。
我有一个macports版本的python-2.7和llvm 3.6和pip版本的numba (一切都是最新的)。
下面是我使用的代码:
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
这样的内容,得到正确的答案如下:
array([[ 0., nan, nan],
[ 1., 0.5, nan],
[ 2., 1.5, 1.],
[ 3., 2.5, 2.],
[ 4., 3.5, 3.]])
但是,如果在函数返回之前取出print ma
行,它只返回部分答案:
array([[ nan, nan, nan],
[ nan, nan, nan],
[ nan, nan, nan],
[ 3., 2.5, 2.],
[ 4., 3.5, 3.]])
为什么会发生这种事?为什么@jit需要这些循环之间的打印才能得到正确的答案?我能做些什么来摆脱print语句(这大大增加了运行时)?
编辑:我接受了@JoshAdel的建议,并在Numba的github上打开了一个问题。因此,我接受@MSeifert的回答,因为解决办法解决了我的问题。
发布于 2016-02-06 04:38:29
我认为numba
在这里做了一些奇怪的事情,但可能是因为python
和nopython
模式的混合。如果我使用Python3.5,返回的结果与print
相同,也不一样。
对于python2.7,我认为问题在于For -循环要么是在nopython
模式下编译的(没有打印),要么是在python
模式下编译的(带有打印)。但在退出循环时转换为python
。但那只是猜测。但我试过了
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
它确实回来了:
array([[ 0., nan, nan],
[ 1., 0.5, nan],
[ 2., 1.5, 1.],
[ 3., 2.5, 2.],
[ 4., 3.5, 3.]])
然而,由于len(adj_close)+1
的重新计算,这并不是一种非常有效的方法。这个可能藏在某个地方。
https://stackoverflow.com/questions/35236352
复制