我有一些(少量)物品的清单,如:
my_list = [1,2,3,4,5,6,7,8,9,10]我有一组索引,如:
indexes = (1,5,9)我想要列表中值的元组(如:
tuple(my_list[x] for x in indexes)但事实证明,这是相当缓慢的(当运行了许多次)。
对于我运行的每个列表,索引的元组不会改变--那么有更快的方法吗?
我正在使用Python2.5,到目前为止我得到了这些令人惊讶的结果:
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这是一个异常,还是列表的理解真的比生成器的表达要好得多?
发布于 2014-04-25 15:56:52
operator.itemgetter (你真的必须使用2.5吗?)它已经死了,被埋了。
除了简单之外,由于在C中实现,它还应该稍微快一些。当您知道需要哪些索引时,您可以构造一个itemgetter项,然后在许多列表中反复调用它。它仍然需要每次复制N个条目并创建一个元组,但是它应该尽可能快地做到这一点。
发布于 2014-04-25 16:28:53
另一种选择,尽管速度慢于德尔南,是使用__getitem__在强制令与map。然而,即使使用导入语句,delnan的版本也更快。
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:
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-变量慢:
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 loophttps://stackoverflow.com/questions/23297702
复制相似问题