Python itertool和多处理,如何并行生成所有可能的组合
我有下面的代码,它生成所有可能的组合,产生一个给定的和(n)。但是,对于大数字(n),此代码需要很长时间。有没有一种方法可以跨多个处理器并行化我的代码Python itertool和多处理,如何并行生成所有可能的组合,python,python-2.7,parallel-processing,multiprocessing,itertools,Python,Python 2.7,Parallel Processing,Multiprocessing,Itertools,我有下面的代码,它生成所有可能的组合,产生一个给定的和(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,
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%的场景都是白费力气的。@Mohamadirahim这当然可以使用线程或类似的模块,尽管我不太习惯于帮助您。
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