python不连续切片_python列表中不连续的切片

itertools.compress(2.7 / 3.1中的新功能)很好地支持这样的用例,特别是与itertools.cycle结合使用时:

from itertools import cycle, compress

seq = range(100)

criteria = cycle([True]*10 + [False]*20) # Use whatever pattern you like

>>> list(compress(seq, criteria))

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

Python 2.7定时(相对于Sven的显式列表理解):

$ ./python -m timeit -s "a = range(100)" "[x for start in range(0, len(a), 30) for x in a[start:start+10]]"

100000 loops, best of 3: 4.96 usec per loop

$ ./python -m timeit -s "from itertools import cycle, compress" -s "a = range(100)" -s "criteria = cycle([True]*10 + [False]*20)" "list(compress(a, criteria))"

100000 loops, best of 3: 4.76 usec per loop

Python 3.2定时(也相对于Sven的显式列表理解):

$ ./python -m timeit -s "a = range(100)" "[x for start in range(0, len(a), 30) for x in a[start:start+10]]"

100000 loops, best of 3: 7.41 usec per loop

$ ./python -m timeit -s "from itertools import cycle, compress" -s "a = range(100)" -s "criteria = cycle([True]*10 + [False]*20)" "list(compress(a, criteria))"

100000 loops, best of 3: 4.78 usec per loop

可以看出,与2.7中的在线列表理解相比,它并没有大的差异,但是通过避免隐式嵌套范围的开销有助于3.2。

在2.7中也可以看到类似的差异,如果目的是迭代结果序列,而不是将其转化为完全实现的列表:

$ ./python -m timeit -s "a = range(100)" "for x in (x for start in range(0, len(a), 30) for x in a[start:start+10]): pass"

100000 loops, best of 3: 6.82 usec per loop

$ ./python -m timeit -s "from itertools import cycle, compress" -s "a = range(100)" -s "criteria = cycle([True]*10 + [False]*20)" "for x in compress(a, criteria): pass"

100000 loops, best of 3: 3.61 usec per loop

对于特别长的模式,可以使用像chain(repeat(True,10),repeat(False,20))这样的表达式来替换模式表达式中的列表,以便它永远不必在内存中完全创建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值