3 回答
TA贡献1828条经验 获得超6个赞
>>> lst = list(range(165))
>>> lst[0::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
请注意,这比循环并检查每个元素的模量快约100倍:
$ python -m timeit -s "lst = list(range(1000))" "lst1 = [x for x in lst if x % 10 == 0]"
1000 loops, best of 3: 525 usec per loop
$ python -m timeit -s "lst = list(range(1000))" "lst1 = lst[0::10]"
100000 loops, best of 3: 4.02 usec per loop
TA贡献1780条经验 获得超1个赞
source_list[::10]
是最明显的,但这对任何可迭代的方法都无效,并且对于大列表而言内存效率不高。itertools.islice(source_sequence, 0, None, 10)
适用于任何可迭代且内存有效的方法,但对于大型列表和大型步骤而言,可能不是最快的解决方案。(source_list[i] for i in xrange(0, len(source_list), 10))
TA贡献1802条经验 获得超5个赞
为什么不只使用range函数的step参数来获得:
l = range(0, 1000, 10)
为了进行比较,在我的机器上:
H:\>python -m timeit -s "l = range(1000)" "l1 = [x for x in l if x % 10 == 0]"
10000 loops, best of 3: 90.8 usec per loop
H:\>python -m timeit -s "l = range(1000)" "l1 = l[0::10]"
1000000 loops, best of 3: 0.861 usec per loop
H:\>python -m timeit -s "l = range(0, 1000, 10)"
100000000 loops, best of 3: 0.0172 usec per loop
添加回答
举报