使用numba的Python代码计时

时间:2015-11-22 00:29:19

标签: python numba

我正在尝试使用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(...)。

有人有解释吗?

1 个答案:

答案 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函数来说,它是。