【发布时间】:2018-01-16 16:08:56
【问题描述】:
当父函数调用子函数时,我注意到一些奇怪的性能结果,并且这两个函数都是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
【问题讨论】:
-
这可能很有用。我只是在我的机器(i7-8700K)上使用 llvmlite-0.29.0、numba-0.45.1、python 3.6.8、ubuntu 18.10 运行上面的代码。 〜1.9178 用于bubble_sort,〜1.4993 用于nested_with_jit,〜1.9202 用于nested_without_jit。因此,对于现代版本的 numba 来说,嵌套函数可能不是问题
标签: python python-3.x numba