Python 第一次执行和后续执行之间的区别

Python 第一次执行和后续执行之间的区别,python,numba,execution-time,Python,Numba,Execution Time,我刚开始使用numba来提高我的程序的性能。我已经减少了我将要提出的案例 import numba as nb import numpy as np from time import time def dt_max(U,f, eps=1e-5): return np.min( np.abs( U ) / ( np.abs( f ) + eps ) ) @nb.njit(cache=True) def fast_dt_max(U,f, eps=1e-5): m=U

我刚开始使用numba来提高我的程序的性能。我已经减少了我将要提出的案例

import numba as nb
import numpy as np
from time import time


def dt_max(U,f, eps=1e-5):
    return np.min( np.abs( U ) / ( np.abs( f ) + eps ) )

@nb.njit(cache=True)
def fast_dt_max(U,f, eps=1e-5):      
    m=U[0]
    if m<0 : m=-U[0]
    for i in range(len(U)) :
        v = abs(U[i]) / ( abs(f[i]) + eps )
        if v < m : m = v
    return m


N=100
Niter = int(1e5)

x=np.linspace(-50,50,N)

t0 = time()
for i in range(Niter):
    dt_max(x,x)
print('numpy',time()-t0)

t0 = time()
for i in range(Niter):
    fast_dt_max(x,x)
print('numba' ,time()-t0)
问题如下。当我第一次执行此程序时,它看起来工作正常:

runfile('E:/02-Codes/TestCode/Python_numba/bug_second_execution.py', wdir='E:/02-Codes/TestCode/Python_numba')
numpy 0.45239996910095215
numba 0.2964000701904297
但当我重复执行所有文件时:

runfile('E:/02-Codes/TestCode/Python_numba/bug_second_execution.py', wdir='E:/02-Codes/TestCode/Python_numba')
numpy 0.45239996910095215
numba 3.5879998207092285

runfile('E:/02-Codes/TestCode/Python_numba/bug_second_execution.py', wdir='E:/02-Codes/TestCode/Python_numba')
numpy 0.4679999351501465
numba 3.5734000205993652
麻木人的表现根本不一样。如果我在spyder环境中重新启动Python内核,问题又会出现:第一次执行很好,但以下所有情况都不好

所以第一个问题是:为什么?第二个问题是:如何避免这种情况


谢谢你的帮助

非常感谢Max的回答

事实上,eps的默认值是问题的原因。如果我切换到调试模式(感谢Max的提示!):

导入操作系统
os.environ['NUMBA\u DEBUG\u CACHE']=“1”
进口麻木为nb
将numpy作为np导入
从时间导入时间
@注意:njit(cache=True)
def fast_dt_max(U,f,eps=1e-5):
m=U[0]

如果问题似乎来自设置eps的默认变量。这将导致重新打开解释器后重新编译。您可以通过将环境变量NUMBA_DEBUG_CACHE设置为1来检查此行为。例如:(设置NUMBA_DEBUG_CACHE=1)并没有为eps设置默认值。如果缓存目录中的一个函数有多个缓存版本,这也可以解释加载预缓存版本的时间非常慢。顺便说一句:您的Numba和Numpy版本不相等。如果出现被零除的情况,Numba版本将在默认情况下像Python一样运行,并引发异常。在Numpy中,被零除的结果是inf,您将看到运行时警告。如果您编写@nb.njit(cache=True,error_model=“numpy”),Numba的行为将类似于numpy,但没有运行时警告。您所说的“Numba和numpy版本不相等”是什么意思?我的numba版本是0.40.1,我的numpy版本是1.14.5。关于错误的好提示\u model=“numpy”,它允许在eps=0的情况下处理无错误的案例。谢谢我的意思是,在被零除的情况下,您的Numba版本会在不设置error_model=“numpy”的情况下引发异常,而numpy函数不会。这可能会导致不必要的行为。好吧,不相等的意思是不相同。我明白,谢谢。
runfile('E:/02-Codes/TestCode/Python_numba/bug_second_execution.py', wdir='E:/02-Codes/TestCode/Python_numba')
numpy 0.45239996910095215
numba 3.5879998207092285

runfile('E:/02-Codes/TestCode/Python_numba/bug_second_execution.py', wdir='E:/02-Codes/TestCode/Python_numba')
numpy 0.4679999351501465
numba 3.5734000205993652
import os
os.environ['NUMBA_DEBUG_CACHE'] = '1'
import numba as nb
import numpy as np
from time import time

@nb.njit(cache=True)
def fast_dt_max(U,f, eps=1e-5):
    m=U[0]
    if m<0 : m=-U[0]
    for i in range(len(U)) :
        v = abs(U[i]) / ( abs(f[i]) + eps )
        if v < m : m = v
    return m
@nb.njit(cache=True)
def fast_dt_max(U,f, eps):
    m=U[0]
    if m<0 : m=-U[0]
    for i in range(len(U)) :
        v = abs(U[i]) / ( abs(f[i]) + eps )
        if v < m : m = v
    return m