Python元组中的高效多任意索引访问?

dg9*_*g99 4 python tuples slice

我有一个很长的Python元组t.我想抓住元素的索引i1,i2......,iNt尽可能高效.什么是最好的方式?

一种方法是:

(1)    result = [t[j] for j in (i1, i2, ..., iN)]
Run Code Online (Sandbox Code Playgroud)

但这似乎会导致N个单独的查找到元组.有更快的方法吗?当Python做这样的切片时:

(2)    result = t[1:M:3]
Run Code Online (Sandbox Code Playgroud)

我假设它不执行M/3单独查找.(也许它使用位掩码并执行单个复制操作?)是否有一些方法可以利用Python中的任何内容(2)使我的任意索引切片在单个副本中发生?

谢谢.

Joh*_*ooy 7

如果您正在进行大量相同的查找,则可能需要使用itemgetter

from operator import itemgetter
mygetter = itemgetter(i1, i2, ..., iN)
for tup in lots_of_tuples:
    result = mygetter(tup)
Run Code Online (Sandbox Code Playgroud)

对于一次性,创建itemgetter的开销是不值得的

iPython中的快速测试显示:

In [1]: import random

In [2]: from operator import itemgetter

In [3]: t=tuple(range(1000))

In [4]: idxs = tuple(random.randrange(1000) for i in range(20))

In [5]: timeit [t[i] for i in idxs]
100000 loops, best of 3: 2.09 us per loop

In [6]: mygetter = itemgetter(*idxs)

In [7]: timeit mygetter(t)
1000000 loops, best of 3: 596 ns per loop
Run Code Online (Sandbox Code Playgroud)

显然,差异将取决于元组的长度,索引的数量等.