如何并行化以下代码,属性列中的元素数量接近 15,因此组合需要更多时间。
combs = set()
for L in range(0,len(attributes)+1):
combs.add(itertools.combinations(attributes,L))
有什么方法可以使用多处理并行化它?
我试过这个,但我收到了这个错误。- 如果块大小 <= 0:
TypeError:不可排序的类型:range() <= int()
import itertools
from multiprocessing import Pool
def comb(attributes):
res = itertools.combinations(attributes)
return res
def main():
p = Pool(4)
times = range(0,len(attributes)+1)
values = p.map(comb,attributes,times)
p.close()
p.join()
print(values)
if __name__ == '__main__':
attributes =('Age', 'Workclass', 'Fnlwgt', 'Education', 'Education-num', 'marital-status', 'Occupation', 'Relationship', 'Race', 'Sex', 'Capital-gain', 'Capital-loss', 'Hours-per-week', 'Native country', 'Probability', 'Id')
main()
既然被要求解释这个问题,那么你就去吧......我试图在不更换的情况下获得组合。基本上是n!。例如,如果我的属性变量中有 A,B,C,我试图获取 (A),(B),(C),(A,B),(A,C),(A,B, C)。由于属性中的元素数量不是静态的,并且会根据输入数据集而变化,因此我无法对其进行硬编码。所以,我在这里使用 len(attributes),其中属性将存储数据集中的属性。然后创建组合, itertools.combinations(attributes,L) 通常会创建长度 L 的所有组合。在我的示例中,如果我给出长度(属性),那么我将只得到 ABC,而不是其他组合。所以我创建了一个长度范围并添加一个来处理第零个元素。
现在回到问题上来,我的数据集中可能有 15 个元素,因此长度(属性)将是 15,即 15!。这个组合生成需要很多时间,因为它必须做这个阶乘。所以我正在考虑以每个处理器一次处理一个组合集生成的方式并行化它,例如一个处理器将生成长度为 2 和长度为 3 的其他组合的所有组合,等等......但是在池映射中我我无法正确传递多个论点。希望这可以清除情况,如果需要进一步解释,请告诉我。