我有工人和任务要做:workers = ['peter', 'paul', 'mary']
tasks = range(13)
现在我想把任务分成几块或几批工作,这样每个工人就可以在一个批次中工作,并且与其他人做的工作量差不多。在我的现实生活中,我希望将批处理作业调度到计算场。批处理作业应该并行运行。实际的计划和调度是由商业级工具(如lsf或grid)完成的。在
一些我期望的例子:
^{pr2}$
这个问题与here,here,和{a3}非常相似
不同的是,我想要这些功能,按顺序或优先顺序排列:不使用len,如果可能的话,不要在内部建立长数据结构
接受发电机
回流发电机
尽可能多地使用stdlib组件
关于要求的一些旁注:没有故意的dicts:我有一个同名的worker可以执行多个批处理(unix主机名)。如果您的解决方案使用dicts,这很好,因为我们总是可以通过批处理枚举来执行worker查找。在
任意长度:worker和task都可以是任意长度的iterable>;=1。而且它们不必像上面的例子那样平均分配,Mary只得到一个任务。在
秩序:对我来说并不重要。我想其他人可能更喜欢[0,1]、[2,3]、[5]这样的顺序,但我不在乎。如果您的解决方案能够保持或改变顺序,那么可能值得向其他人指出这一点。在
我已经试着把我的思想集中在itertools和这个特定的问题上,并想出了下面的代码来说明这个问题:from itertools import *
def distribute_work(workers, tasks):
batches = range(len(workers))
return [ ( workers[k],
[t[1] for t in i]
) for (k,i) in groupby(sorted(zip(cycle(batches),
tasks),
key=lambda t: t[0]),
lambda t: t[0]) ]
这满足4,但排序很可能违反1。。和2/3。根本没想过。在
可能有一些简单的解决方案,用我没有想到的方式组合一些stdlib组件。但也许不是。有人吗?在