【发布时间】:2016-02-24 08:01:57
【问题描述】:
我正在尝试使用 numba 进行一些时间比较。
以下mwe.py 中我不明白的是为什么我会得到不同的结果
from __future__ import print_function
import numpy as np
from numba import autojit
import time
def timethis(method):
'''decorator for timing function calls'''
def timed(*args, **kwargs):
ts = time.time()
result = method(*args, **kwargs)
te = time.time()
print('{!r} {:f} s'.format(method.__name__, te - ts))
return result
return timed
def pairwise_pure(x):
'''sample function, compute pairwise distancee, see: jakevdp.github.io/blog/2013/06/15/numba-vs-cython-take-2/'''
M, N = x.shape
D = np.empty((M, M), dtype=np.float)
for i in range(M):
for j in range(M):
d = 0.
for k in range(N):
tmp = x[i, k] - x[j, k]
d += tmp * tmp
D[i, j] = np.sqrt(d)
return D
# first version
@timethis
@autojit
def pairwise_numba(args):
return pairwise_pure(args)
# second version
@timethis
def pairwise_numba_alt(args):
return autojit(pairwise_pure)(args)
x = np.random.random((1e3, 10))
pairwise_numba(x)
pairwise_numba_alt(x)
评估 python3 mwe.py 会得到以下输出:
'pairwise_numba' 5.971631 s
'pairwise_numba_alt' 0.191500 s
在第一个版本中,我使用 timethis 来装饰方法来计算时间,并使用 autojit 来加速代码,而在第二个版本中,我使用 timethis 来装饰函数,然后调用 autojit(...)。
有人解释一下吗?
【问题讨论】:
-
我不知道 numba,但从装饰者的角度来看,这两个例子并不相等,第一个你有 timethis(autojit(pairwise_numba)) 而第二个 timethis(pairwise_numba_alt)
-
看起来在第一个版本中,您只是在自动调整包装器。也许它会很快委托给它包装的函数,但它包装的函数并没有得到 jitted。
-
@user2357112,是的,我认为您的分析是正确的,在第一个版本中,似乎 autojit 以某种方式应用于包装器而不是内部的函数,因此没有优化。