我正在尝试使用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(...)。
有人有解释吗?
答案 0 :(得分:2)
实际上documentation明确指出,对于优化,每次调用其他函数" inside"装饰功能也应该装饰,或者不进行优化。
对于许多函数,例如foreach ($formConfig as $elementConfig) {
switch (strtolower($elementConfig['type'])) {
case 'text':
$className = 'Element\T_COMPANY';
break;
default:
throw new Exception();
break;
}
$formElement = new $className("", "Required", array(
"required" => 1,
"placeholder" => "*Bedrijf:",
));
$form->addElement($formElement);
}
$form = new Form($formConfig);
函数,这些函数不是必需的,因为它们是高度优化的,但对于本机python函数来说,它是。