【问题标题】:itertool and multiprocessing, How can I generate all possible combinations in Parallelitertool 和多处理,如何并行生成所有可能的组合
【发布时间】:2017-02-26 11:54:46
【问题描述】:

我有以下代码,它生成所有可能的组合,产生给定的总和 (n)。但是,对于大数 (n),此代码需要很长时间。有没有办法让我的代码跨多个处理器并行化?

from itertools import combinations_with_replacement

def all_combination(numbers, n):
result = [seq for i in range(n, 0, -1) for seq in combinations_with_replacement(numbers,i) if sum(seq) == n]
return result

numbers = [1, 2, 3, 4, 5, 6]
n=700
print len(all_combination(numbers,n))

【问题讨论】:

  • 您了解这里的基本算法复杂性吗?组合的数量呈指数增长,而多处理只能为您提供线性加速。如此简化和渐近:多处理使您有可能将 N 增加 1(四舍五入!)。
  • 并行处理这样一个过程仍然需要相同的时间:一个处理器全速工作与两个处理器各以一半速度工作几乎相同。当您的程序的一部分运行速度比另一个(例如代码与用户输入)更快时,多处理器和并发编程(即线程和协同)很有用,而不是在这种情况下。
  • 我在想一个列表是否可以处理生成列表的一半,而另一个可以处理另一半。
  • 最简单的方法是手动执行前 1 或 2 个步骤(分支),然后并行运行剩余的步骤。但正如我所说:对于 99.9% 的场景来说,这是浪费工作。
  • @MohamadIbrahim 这当然可以使用线程或类似模块,尽管我有点不习惯帮助你。

标签: python python-2.7 parallel-processing multiprocessing itertools


【解决方案1】:
from itertools import product
import math
import multiprocessing

def parallel_combination(i, limit):
    numbers = [1, 2, 3, 4, 5, 6]
    result=0
    for seq in combinations_with_replacement(numbers, i):
        if sum(seq) == limit:
            result+=1
    return result

def chunks(min_value, max_value):
    for i in range(max_value, min_value, -1):
        yield i

if __name__ == "__main__":
    max_value=610
    limit=610
    min_value=int(math.floor(float(limit/6)))
    pool = multiprocessing.Pool()
    n_processesor=32
    chunk_size=int((math.ceil(float((max_value-min_value))/n_processesor)))
    processes = pool.map(func=parallel_combination, limit, iterable=chunks(min_value,max_value), chunksize=chunk_size)
   final_result=0
   for process in processes:
        if process:
            final_result+=process
    print final_result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多