import numba
from typing import List

@numba.njit
def test(a: List[int]) -> int:
    return 1

test([i for i in range(2_000_000)])

取2并随列表大小线性扩展. 用numba.typed.List包裹输入参数需要更长的时间.(所有时间都花在了numba.typed.List电话上.

如果该函数被多次调用(而仅定义一次),则计时不会变得更好,即,这不是编写时间的问题.

有没有办法告诉Numba按原样使用列表?

在我的实际应用程序中,原始数据来自外部库,该库无法直接返回numpy数组或numba列表,只能返回Python列表.

我正在一台配备16 GB RAM的4核Ubuntu22笔记本电脑上使用numba 0.59.1和Python 3.12.

推荐答案

Numba仅适用于typed个变量.它不仅需要check the types of all the items,还需要convert the whole list到输入列表中.这种隐式转换可能特别昂贵,因为CPython列出了,又名反射列表包含分配对象上的指针,并且每个对象都被引用计数.Numba的类型化列表是同质的,它们不包含引用,而是直接包含其中的值.这要高效得多,并且类似于具有NPS等附加功能的Numpyarray.

有没有办法告诉Numba按原样使用列表?

AFAIK,不.Numba代码中不再支持反射列表.对反射列表进行操作不仅效率低下,而且还会 destruct 类型系统.

最好的 Select 是create directly a typed list.下面是一个例子:

import numba as nb

# Quite fast part (less than 0.1 seconds)
reflected_lst = [i for i in range(2_000_000)]

# Slow part (3 seconds)
typed_lst = nb.typed.typedlist.List(reflected_lst)

# Very fast part (less than 2 µs) since `lst` is already a typed-list
test(typed_lst)

正如@roganjosh所提到的,请注意,列表生成包含在您的基准测试中,但这只占用执行时间的一小部分

请注意,Numba中的转换过程特别昂贵(与Numpy相反,请参阅下面的 comments ).有一个opened issue on this topic.引用开发商的话:

[...] we came to the conclusion that there is probably room for improvement.
[...] this problem is all down to implementation details.

到目前为止,该问题仍然悬而未决,并且有一个补丁可以稍微提高转换的性能,但速度仍然相当慢.

Python相关问答推荐

Pandas :多索引组

jit JAX函数中的迭代器

GL pygame无法让缓冲区与vertextPointer和colorPointer一起可靠地工作

三个给定的坐标可以是矩形的点吗

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

Pystata:从Python并行运行stata实例

Pandas - groupby字符串字段并按时间范围 Select

如何更改groupby作用域以找到满足掩码条件的第一个值?

幂集,其中每个元素可以是正或负""""

从列表中获取n个元素,其中list [i][0]== value''

Python—为什么我的代码返回一个TypeError

在二维NumPy数组中,如何 Select 内部数组的第一个和第二个元素?这可以通过索引来实现吗?

使用__json__的 pyramid 在客户端返回意外格式

Pandas在rame中在组内洗牌行,保持相对组的顺序不变,

利用SCIPY沿第一轴对数组进行内插

用0填充没有覆盖范围的垃圾箱

多索引数据帧到标准索引DF

如何获取给定列中包含特定值的行号?

我怎样才能让深度测试在OpenGL中使用Python和PyGame呢?

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?