【发布时间】:2021-01-18 17:10:18
【问题描述】:
我有任何类型的对象的大型 Python 列表 l,我还有另一个大型列表 i(甚至是 NumPy 数组)指向列表 l 中的某些元素的整数索引。
问题是创建另一个列表l2 的最快(最有效)方法是什么,该列表包含l 的元素,索引来自i。
最简单的方法是做一个列表推导:
l2 = [l[si] for si in i]
# Use np.nditer(i) instead of i, for NumPy array case
但这是最快的方法吗?
列表理解是一个 Python 循环,所以对于大型列表可能会很慢,也许标准库中有一些内置的 Python 方法,用高效的C 编写来完成这个任务?或者NumPy有这样的方法可以通过numpy数组索引Python的列表?
也许标准python库中有一些简单而快速的函数可以对NumPy的np.take做同样的事情,就像下面的假想代码:
import listtools
l2 = listtools.take(l, indexes)
【问题讨论】:
-
这里回答的问题完全相同 - stackoverflow.com/questions/9008533/…。那里的建议是使用生成器而不是列表理解
-
@YossiLevi 我不相信生成器是最快的方法,同样对于我的任务,您需要通过执行
l2 = list(generator_())将列表从生成器中取出,这是另一个缓慢的操作。同样在那个问题中只有一个答案,我希望还有十几种其他没有提到的快速方法。 -
列表一次只能索引一项(4或切片)。并且迭代列表比迭代数组更快(
nditer没有帮助)。所以基本的列表理解是最有意义的。请记住,它只是复制参考。 -
@hpaulj 我想为大型列表找到最快的方法。我担心的是列表理解本身很慢,因为它是一个 python 循环代码。所以我认为标准库中可能有一些快速简单的特殊方法,例如喜欢
import listtools; l2 = listtools.take(l, indexes)。 -
@Arty。列表推导比通用循环快很多,Paul 的回答显示最接近的 python 必须是
take。