【问题标题】:How to modify a list in Numba without completely destroying performance?如何在不完全破坏性能的情况下修改 Numba 中的列表?
【发布时间】:2017-04-11 18:32:12
【问题描述】:

这是一个例子。如果您运行此代码,它将打印调用 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 数组,因为我需要在代码中的其他地方调整列表的大小。)

【问题讨论】:

  • 你为什么要这样做?动机是什么?
  • @Veedrac:你是什么意思?您无法想象人们需要不固定大小的列表的场景?

标签: python performance list copy numba


【解决方案1】:

如果你真的需要在 Numba 中使用列表,并且副本太昂贵,你将需要在对象模式下编译这个函数。 nopython 模式不能直接对列表进行操作;这样做本质上是一个 Python 对象操作,nopython 模式禁止的事情。

【讨论】:

  • 这不会破坏使用 Numba 的意义吗?该函数的重点是对列表进行操作,所以如果我只是在 Python 模式下执行它不会更快,对吧?真的没有办法吗?。
  • @Mehrdad:Numba 可能能够做一些 loop-jitting(在你的例子中不可能),或者它可以使用像 PyList_GetItemPyList_SetItem 这样的调用来避免动态调度(我不不知道它是否知道如何做到这一点),但您可能不会看到与普通 Python 函数相比没有任何好处。
  • 我认为 Cython 可以做得更好;例如,我认为 Cython 与 Python 标准库 array 模块提供了更好的互操作性,该模块介于列表和 NumPy 数组之间,可能适合您的用例。
猜你喜欢
  • 1970-01-01
  • 2021-07-09
  • 2022-01-16
  • 2010-12-21
  • 1970-01-01
  • 2011-03-11
  • 2019-02-28
  • 2020-09-29
  • 2019-10-03
相关资源
最近更新 更多