我正在尝试开发一种方法来处理大型并行任务以强制执行密钥空间。我希望能够想出一种方法来传递一个worker值,使得给定一个块大小,该值将告诉工作输出什么。
简单地说:
给出一个charset(a-z)和一个最大legth为1(基本上是a-z)和一个块大小为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发送给worker 1,它将在该chunkpart上执行它需要做的事情。
当我需要获得一小块(1000条记录)但远远进入大型集合时,问题就会发挥作用。假设maxlen是10而chunkpart是50,000,000。 Python需要很长时间才能达到这一点。
所以,我想我知道为什么会发生这种情况,需要做一些数学计算才能弄清楚在迭代器中的位置;我想知道的是,有没有更好的方法让我做这个快捷方式?我的直觉告诉我,itertools有答案,我的大脑说你需要更好地理解itertools。