Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么numba.jit和python会产生不同的结果?_Python_Numba - Fatal编程技术网

为什么numba.jit和python会产生不同的结果?

为什么numba.jit和python会产生不同的结果?,python,numba,Python,Numba,在下面的代码中,numba.jit生成7732.96。。。python给出了-6351.97。。。(为了简洁起见,省略了数字)。我能做些什么来解决这个问题?这是numba的错误还是我的编码错误?我在Spyder 3上使用了Python 3.7(anaconda) from numba import jit import numpy as np @jit(nopython=True) def test(n): sum = 0.0 arr = np.arange(2, n)

在下面的代码中,numba.jit生成7732.96。。。python给出了-6351.97。。。(为了简洁起见,省略了数字)。我能做些什么来解决这个问题?这是numba的错误还是我的编码错误?我在Spyder 3上使用了Python 3.7(anaconda)

from numba import jit
import numpy as np

@jit(nopython=True)
def test(n):
     sum = 0.0
     arr = np.arange(2, n)
     for x in np.sin(np.cos(arr ** 2)):
           sum += x
     return sum


a = test(100000000)
print(a)

我无法重现你的错误:

from numba import jit
import numpy as np

def test(n):
    sum = 0.0
    arr = np.arange(2, n)
    for x in np.sin(np.cos(arr ** 2)):
        sum += x
    return sum

testnb = jit(nopython=True)(test)

N = 100000000
print(test(N))
print(testnb(N))
# 7732.969676855288
# 7732.969676855337

我使用的是numba 0.45.1、python 3.7.3和numpy 1.16.4。我最初的猜测是存在某种浮点问题,在非JIT形式中,
sum
是一个具有无限精度的python值,而在JIT代码中,
sum
根据您的系统被键入特定的float32或float64。但对于你的特殊系统,我不确定发生了什么

“sum是一个具有无限精度的python值”我认为只有当它是
int
对象,
float
对象基本上都是C-double对象时,这才是真的。@JoshAdel:非常感谢,但是你能运行我的代码版本吗(不是你的)?我希望你能看到问题所在。@juanpa.arrivillaga,你是对的。我关于无限精度的评论是不正确的。@正如上面指出的,您的代码和我的代码在功能上是相同的。我只是选择不使用decorator,这样我就可以很容易地比较纯python实现和jitted版本。@JoshAdel:我当然知道这两个版本在功能上是相同的。我在NUMPY1.15.1上运行了您的版本(testnb=jit(nopyton=True)(test)等),仍然得到了相同的两个(不同的)结果:负6351.9和正7732.9。请看我今天的其他评论。你能在1.15.1上运行你的代码并告诉我你得到了什么吗?非常感谢。请参阅我对原始问题的编辑,在这里我回应您(有缺陷)将此问题描述为离题。如果你知道我问题的答案,请提供。这将非常有帮助;否则请取消暂停,这样我可以从其他人的回复中获益。谢谢。你是怎么得到结果的?6351.9?您发布的代码为7732.9。我们无法重现第一个结果。代码打印的准确值为-6351.975726109694。我在Win 10中运行的基于intel core i3的Dell Inspiron(基于x64)上使用了python 3.7.0(64位)、numpy 1.15.1、numba 0.39.0、Ipython 6.5.0(Spyder 3编辑器)。我怀疑有溢出问题,但代码中没有任何内容看起来可疑。谢谢你的指点。我试过你的版本,它给出了7732.9。所以你的问题中缺少了一些东西。要么是某些版本信息出现了问题(不太可能),要么是代码或解释器中的其他内容没有显示(更有可能)。投票结果分为“不可复制”(因为您的代码有效)和您现在看到的结果(“不”,因为您可能无法用代码看到结果,所以缺少了一些内容)。就个人而言,我投票支持后者,因为您正在用两个方法比较两个值,但您的代码只包含一个方法。这已经很可疑了。据我所知,回答者使用了你的确切密码。
@jit
装饰符是回答者所做事情的语法糖。他们只需要更改您的代码,因为您没有添加要比较的两个版本。与应答者一样,将decorator替换为手动调用
numba.jit
,是访问修饰函数和原始函数的最简单方法,这两个源的值是不一致的。欢迎您提出问题,以添加只有您看到的问题根源的证据,但在此之前,我已将投诉从问题中删除。