Code: Alles auswählen
def grouper_it(n, iterable):
# http://stackoverflow.com/a/8998040/969534
it = iter(iterable)
while True:
chunk_it = itertools.islice(it, n)
try:
first_el = next(chunk_it)
except StopIteration:
return
yield itertools.chain((first_el,), chunk_it)
Das funktioniert auch super, wenn man die Chunks nacheinander 'consumed', aber nicht in dem Szenarion:
Code: Alles auswählen
for chunk in grouper_it(3, [1,2,3,4,5,6,7,8,9,0]):
print chunk, len(list(chunk))
# <itertools.chain object at 0x7f89dacdc850> 3
# <itertools.chain object at 0x7f89dacdc910> 3
# <itertools.chain object at 0x7f89dacdc850> 3
# <itertools.chain object at 0x7f89dacdc910> 1
print len(list(grouper_it(3, [1,2,3,4,5,6,7,8,9,0])))
# 10 -> sollte 4 sein
Normalerweise ist das auch kein Problem, aber ich versuche über `gevent.Pool.pool.imap_unordered` eine Funktion mit Chunks einer bestimmten größe zu callen: `return pool.imap_unordered(foo, grouper_it(3, [1,2,3,4,5,6,7,8,9,0]))` und meine Funktion `foo` wird 10mal aufgerufen mit jeweils einem Eintrag.
Eine offensichtliche Lösung ist nicht iteratoren zu verwenden (bzw. `chunk_it = list(chunk_it)` in der Funktion zu machen), das ist leider keine Lösung weil meine Ausgangsliste durchaus mehr als 10 Elemente (mehr so an die 50k) hat.
PS: Der Codebox gefallen Links in Kommentaren anscheinend nicht