numba.jit函数调用另一个numba.jit函数的奇怪性能问题

时间:2018-01-16 16:08:56

标签: python python-3.x numba

当父函数调用子函数时,我注意到一些奇怪的性能结果,并且两个函数都是numba.jit编译的。任何人都可以解释这种行为(下面的代码)?更重要的是,无论如何都存在这个问题吗?

为什么这很重要:假设我正在编写一个冗长而复杂的函数,我希望使用numba.jit编译加速。将子过程包装到子函数中是有意义的;然后由父函数调用。如果父函数和子函数都需要及时编译,那么我就会遇到这个问题(即性能下降没有明显的原因)。

代码:

import time
import numpy
import numba


@numba.jit('void(int64[:])', nopython=True)
def bubble_sort(array):
    n = len(array)
    for _ in range(n):
        for i in range(n):
            if i+1 < n and array[i] > array[i+1]:
                temp = array[i]
                array[i] = array[i+1]
                array[i+1] = temp


@numba.jit('void(int64[:])')
def nested_with_jit(array):
    bubble_sort(array)


def nested_without_jit(array):
    bubble_sort(array)


if __name__ == '__main__':
    n = 50000
    array = numpy.arange(n).astype(numpy.int64)

    print('bubble_sort(array)')
    for i in range(5):
        start = time.time()
        bubble_sort(array)
        end = time.time()
        print('\t#{:d}: ~{:.4f} seconds'.format(i, end - start))

    print('nested_with_jit(array)')
    for i in range(5):
        start = time.time()
        nested_with_jit(array)
        end = time.time()
        print('\t#{:d}: ~{:.4f} seconds'.format(i, end - start))

    print('nested_without_jit(array)')
    for i in range(5):
        start = time.time()
        nested_without_jit(array)
        end = time.time()
        print('\t#{:d}: ~{:.4f} seconds'.format(i, end - start))

输出:

bubble_sort(array)
    #0: ~1.9890 seconds
    #1: ~1.9710 seconds
    #2: ~1.9840 seconds
    #3: ~1.9830 seconds
    #4: ~1.9880 seconds
nested_with_jit(array)
    #0: ~2.4730 seconds
    #1: ~2.4690 seconds
    #2: ~2.4620 seconds
    #3: ~2.4640 seconds
    #4: ~2.4380 seconds
nested_without_jit(array)
    #0: ~1.9780 seconds
    #1: ~1.9880 seconds
    #2: ~1.9880 seconds
    #3: ~1.9910 seconds
    #4: ~1.9880 seconds

1 个答案:

答案 0 :(得分:0)

我认为您可能看到的是类型检查和调度的一些小开销,虽然由于某些原因在我的机器上(OSX py2.7 numba 0.36.1),我看到更小的开销(1.45秒)用于直接呼叫bubble_sort,用nested_with_jit呼叫它是1.63秒。如果我在numba.jit(nopython=True)bubble_sort上使用没有明确类型的nested_with_jit,则差异基本上会消失。