외부 패키지를 사용하는 것이 마음에 들지 않으면 1iteration_utilities.grouper
에서 사용할 수 있습니다 . 시퀀스뿐만 아니라 모든 iterable을 지원합니다.iteration_utilties
from iteration_utilities import grouper
seq = list(range(20))
for group in grouper(seq, 4):
print(group)
어떤 인쇄 :
(0, 1, 2, 3)
(4, 5, 6, 7)
(8, 9, 10, 11)
(12, 13, 14, 15)
(16, 17, 18, 19)
길이가 그룹 크기의 배수가 아닌 경우 마지막 항목 채우기 (불완전한 마지막 그룹) 또는 잘림 (불완전한 마지막 그룹 삭제)도 지원합니다.
from iteration_utilities import grouper
seq = list(range(17))
for group in grouper(seq, 4):
print(group)
# (0, 1, 2, 3)
# (4, 5, 6, 7)
# (8, 9, 10, 11)
# (12, 13, 14, 15)
# (16,)
for group in grouper(seq, 4, fillvalue=None):
print(group)
# (0, 1, 2, 3)
# (4, 5, 6, 7)
# (8, 9, 10, 11)
# (12, 13, 14, 15)
# (16, None, None, None)
for group in grouper(seq, 4, truncate=True):
print(group)
# (0, 1, 2, 3)
# (4, 5, 6, 7)
# (8, 9, 10, 11)
# (12, 13, 14, 15)
벤치 마크
또한 언급 된 몇 가지 접근 방식의 런타임을 비교하기로 결정했습니다. 다양한 크기의 목록을 기반으로 "10"요소 그룹으로 그룹화 된 로그-로그 플롯입니다. 질적 결과의 경우 : 낮을수록 더 빠릅니다.
적어도이 벤치 마크에서 iteration_utilities.grouper
성능이 가장 좋습니다. Craz 의 접근 방식 .
벤치 마크는 1 로 만들어졌습니다 . 이 벤치 마크를 실행하는 데 사용 된 코드는 다음과 같습니다.simple_benchmark
import iteration_utilities
import itertools
from itertools import zip_longest
def consume_all(it):
return iteration_utilities.consume(it, None)
import simple_benchmark
b = simple_benchmark.BenchmarkBuilder()
@b.add_function()
def grouper(l, n):
return consume_all(iteration_utilities.grouper(l, n))
def Craz_inner(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
@b.add_function()
def Craz(iterable, n, fillvalue=None):
return consume_all(Craz_inner(iterable, n, fillvalue))
def nosklo_inner(seq, size):
return (seq[pos:pos + size] for pos in range(0, len(seq), size))
@b.add_function()
def nosklo(seq, size):
return consume_all(nosklo_inner(seq, size))
def SLott_inner(ints, chunk_size):
for i in range(0, len(ints), chunk_size):
yield ints[i:i+chunk_size]
@b.add_function()
def SLott(ints, chunk_size):
return consume_all(SLott_inner(ints, chunk_size))
def MarkusJarderot1_inner(iterable,size):
it = iter(iterable)
chunk = tuple(itertools.islice(it,size))
while chunk:
yield chunk
chunk = tuple(itertools.islice(it,size))
@b.add_function()
def MarkusJarderot1(iterable,size):
return consume_all(MarkusJarderot1_inner(iterable,size))
def MarkusJarderot2_inner(iterable,size,filler=None):
it = itertools.chain(iterable,itertools.repeat(filler,size-1))
chunk = tuple(itertools.islice(it,size))
while len(chunk) == size:
yield chunk
chunk = tuple(itertools.islice(it,size))
@b.add_function()
def MarkusJarderot2(iterable,size):
return consume_all(MarkusJarderot2_inner(iterable,size))
@b.add_arguments()
def argument_provider():
for exp in range(2, 20):
size = 2**exp
yield size, simple_benchmark.MultiArgument([[0] * size, 10])
r = b.run()
1 개 면책 조항 : 나는 라이브러리의 저자 해요 iteration_utilities
와 simple_benchmark
.