当父函数调用子函数时,我注意到一些奇怪的性能结果,并且两个函数都是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
答案 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
,则差异基本上会消失。