Наиболее эффективный способ разбиения большого итерируемого в Python для перебора
Я пытаюсь разработать способ решения больших параллельных задач для подбора ключей. Мне бы хотелось найти способ передать работнику значение таким образом, чтобы при заданном размере чанка это значение указывало работе, что выводить.
Просто говоря:
учитывая charset (az) и максимальную длину 1 (в основном az) и размер куска 5
Если я отправлю работнику 1 число 0, то это займет 0-4 итератора, a, b, d, e, f) если я отправлю работнику 2 число 1, то это будет 5-9 и т. Д. У меня есть этот код в основном за работой:
#!/usr/bin/python
import itertools
maxlen = 5
charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
chunksize = 1000
chunkpart = 5
for s in itertools.islice(itertools.chain.from_iterable((''.join(l) for l in itertools.product(charset, repeat=i)) for i in range(1, maxlen + 1)), chunksize*chunkpart, chunksize*(chunkpart + 1)):
print s
Хорошо, это прекрасно работает, если я отправлю chunkpart 5 работнику 1, он будет делать то, что должен делать с этим chunkpart.
Проблема вступает в игру, когда мне нужно получить небольшой кусок (1000 записей), но далеко в большой набор. Допустим, макслену было 10, а частям было 50 000 000. Python занимает ДОЛГОЕ время, чтобы добраться до этой точки.
Так что, я думаю, я знаю, ПОЧЕМУ это происходит, нужно немало математики, чтобы выяснить, куда обращаться в итераторе; что мне интересно, есть ли лучший способ сделать это, что-то ярлыки? Моя интуиция говорит мне, что у itertools есть ответ, мой мозг говорит, что вам нужно лучше понимать itertools.