关于python:使用IPython Parallel的itertools.ifilter

itertools.ifilter with IPython Parallel

对于某些问题(证明是NP难解决的),我没有其他选择,只有详尽的搜索。我有一组数据——为了简单起见,S = ['A', 'B', 'C', ... ,'Z']并希望将函数f应用于此集合中长度为N < len(S)的所有子集。我不能在这里使用列表,因为二项式系数binom(len(S),N)是几十亿。但是对于几乎所有的S值,f(x), x∈S的结果都是零。因此,在简单的情况下,所有的工作都很好

1
2
   from itertools import ifilter, combinations
   answer = list(ifilter(lambda x: f(x) > 0, combinations(S,N)))

但在现实生活中,len(S) ~ 10?N ~ 102。我想要的是在使用ipyparallel的CPU引擎之间分散工作。我有一个拥有100个CPU核心的小集群。但我仍然负担不起将组合存储为列表,因此我需要类似于独立生成器的东西。

有几个例子说明如何将生成器分成块,但据我所知,它们仍然是连续的生成器。还有一个与@minrk相关的想法,但由于某种原因,它的表现确实很糟糕。

所以问题是:

  • 有没有办法直接与ipyparallel实现itertools.ifilter?或
  • 是否可以将python生成器分为一组独立的生成器(独立发送到ipcluster引擎)?

在这里,彻底的搜索是完全没有希望的,无论你如何将其并行。由于len(S)N的数量级如此之高,您需要搜索大约6e241个解决方案候选。这远远超出了人类所希望建立的任何计算系统的能力。

您需要使用更智能的算法。