【问题标题】:Python code timings using numba使用 numba 的 Python 代码计时
【发布时间】: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 以某种方式应用于包装器而不是内部的函数,因此没有优化。

标签: python numba


【解决方案1】:

实际上,documentation 明确指出,为了优化对“内部”其他函数的每次调用,一个装饰函数也应该被装饰,否则它不会被优化。

对于像 numpy 这样的许多函数,这些函数是不必要的,因为它们已经过高度优化,但对于原生 python 函数却是这样。

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 2022-11-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多