如何在不完全破坏性能的情况下修改 Numba 中的列表?
How to modify a list in Numba without completely destroying performance?
举个例子。如果你 运行 这段代码,它会打印出调用 foo
:
大约需要 1 秒的时间
import timeit
import numba
@numba.njit('void(List(intp, True))')
def foo(v): v[0] += 1
a = range(1 << 25)
start = timeit.default_timer()
foo(a)
stop = timeit.default_timer()
print stop - start
显然 Numba 正在来回复制列表。有什么办法可以避免吗?
(我不能轻易使用 NumPy 数组,因为我需要在我的代码中的其他地方调整列表的大小。)
如果你真的需要在 Numba 中使用一个列表,并且副本太昂贵,你将需要在对象模式下编译这个函数。 nopython 模式不能直接对列表进行操作;这样做基本上是一个 Python 对象操作,nopython 模式禁止这样做。
举个例子。如果你 运行 这段代码,它会打印出调用 foo
:
import timeit
import numba
@numba.njit('void(List(intp, True))')
def foo(v): v[0] += 1
a = range(1 << 25)
start = timeit.default_timer()
foo(a)
stop = timeit.default_timer()
print stop - start
显然 Numba 正在来回复制列表。有什么办法可以避免吗?
(我不能轻易使用 NumPy 数组,因为我需要在我的代码中的其他地方调整列表的大小。)
如果你真的需要在 Numba 中使用一个列表,并且副本太昂贵,你将需要在对象模式下编译这个函数。 nopython 模式不能直接对列表进行操作;这样做基本上是一个 Python 对象操作,nopython 模式禁止这样做。