【发布时间】:2011-11-07 02:29:27
【问题描述】:
我有一个很长的 Python 元组 t。我想尽可能有效地从t 中获取索引i1、i2、...、iN 处的元素。最好的方法是什么?
一种方法是:
(1) result = [t[j] for j in (i1, i2, ..., iN)]
但这似乎会导致对元组进行 N 次单独查找。有更快的方法吗?当 Python 进行这样的切片时:
(2) result = t[1:M:3]
我假设它不执行 M/3 单独查找。 (也许它使用位掩码并执行单个复制操作?)我有什么方法可以利用 Python 在 (2) 中所做的任何事情来使我的任意索引切片发生在单个副本中?
谢谢。
【问题讨论】:
-
索引内置序列类型的实例是您可以做的最快的事情之一。对它们进行切片比在循环中自己进行切片更有效的唯一原因是因为它是用 C 编写的,并且循环以及(甚至隐式)调用方法在 Python 中具有更大的开销。此外,只有在
i1到iN是相同数字的倍数加上某个常数时,适用于切片的技巧(如果有这样的技巧......你必须以任何一种方式复制每个项目)才是可能的。跨度> -
你如何确定(i1...iN)?也许在效率(和简单性)方面可以获得收益,但只有在更广泛的范围内重写......
-
这对我来说是一个有趣且令人惊讶的优化。您能否发布代码、性能测试和 cProfile 结果的链接供我们查看?