首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于GenExp和ListComp的Tuple()

关于GenExp和ListComp的Tuple()
EN

Stack Overflow用户
提问于 2014-04-25 15:50:21
回答 2查看 529关注 0票数 6

我有一些(少量)物品的清单,如:

代码语言:javascript
复制
my_list = [1,2,3,4,5,6,7,8,9,10]

我有一组索引,如:

代码语言:javascript
复制
indexes = (1,5,9)

我想要列表中值的元组(如:

代码语言:javascript
复制
tuple(my_list[x] for x in indexes)

但事实证明,这是相当缓慢的(当运行了许多次)。

对于我运行的每个列表,索引的元组不会改变--那么有更快的方法吗?

我正在使用Python2.5,到目前为止我得到了这些令人惊讶的结果:

代码语言:javascript
复制
python -m timeit -s "indexes = (1,5,9); l = [1,2,3,4,5,6,7,8,9,10]" "tuple(l[i] for i in indexes)"
100000 loops, best of 3: 3.02 usec per loop

python -m timeit -s "indexes = (1,5,9); l = [1,2,3,4,5,6,7,8,9,10]" "tuple([l[i] for i  in indexes])"
1000000 loops, best of 3: 0.707 usec per loop

这是一个异常,还是列表的理解真的比生成器的表达要好得多?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-25 15:56:52

operator.itemgetter (你真的必须使用2.5吗?)它已经死了,被埋了。

除了简单之外,由于在C中实现,它还应该稍微快一些。当您知道需要哪些索引时,您可以构造一个itemgetter项,然后在许多列表中反复调用它。它仍然需要每次复制N个条目并创建一个元组,但是它应该尽可能快地做到这一点。

票数 7
EN

Stack Overflow用户

发布于 2014-04-25 16:28:53

另一种选择,尽管速度慢于德尔南,是使用__getitem__在强制令与map。然而,即使使用导入语句,delnan的版本也更快。

代码语言:javascript
复制
In [36]: %timeit tuple(map(my_list.__getitem__,indexes))
1000000 loops, best of 3: 653 ns per loop


In [38]: %timeit itemgetter(*indexes)(my_list)
1000000 loops, best of 3: 292 ns per loop

没有ipython:

代码语言:javascript
复制
python -m timeit -s "indexes = (1,5,9); l = [1,2,3,4,5,6,7,8,9,10]" "tuple(map(l.__getitem__,indexes))"
1000000 loops, best of 3: 0.645 usec per loop

python -m timeit -s "import operator" "indexes = (1,5,9); l = [1,2,3,4,5,6,7,8,9,10]" "operator.itemgetter(*indexes)(l)"
1000000 loops, best of 3: 0.463 usec per loop

看起来,对tuple的转换使map-变量比itemgetter-变量慢:

代码语言:javascript
复制
python -m timeit -s "indexes = (1,5,9); l = [1,2,3,4,5,6,7,8,9,10]" "map(l.__getitem__,indexes)"
1000000 loops, best of 3: 0.489 usec per loop
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23297702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档