我正在创建一种算法,使用生成器对象来强制搜索3x3矩阵的条件以创建所有可能的组合。目前,在单个线程上运行它所需的时间将花费大量时间,但是我可以访问具有多个内核的计算机(64),因此将其线程化至少具有20个线程将是非常可行的选项。
但是,我不能简单地将生成器对象转换为列表并将列表拆分为相同大小的块。存储列表列表所需的RAM量太高了。
我的单线程方法(简化问题)如下:
def permute(xs, low=0):
if low + 1 >= len(xs):
yield xs
else:
for p in permute(xs, low + 1):
yield p
for i in range(low + 1, len(xs)):
xs[low], xs[i] = xs[i], xs[low]
for p in permute(xs, low + 1):
yield p
xs[low], xs[i] = xs[i], xs[low]
generator_obj = permute(range(9))
for l in generator_obj:
search_conditions(l)
什么是线程化的好方法?
答案 0 :(得分:2)
即使你有多个线程,它们仍然会在同一个进程中,只能在一个核心上执行。
为什么不动态创建一组批次,而不是将数据拆分成固定数量的相等块?例如,你可以
pickle
,msgpack
或数据库subprocess.Popen
处理每个批处理并将结果写回磁盘这种方法将使用多核系统的强大功能,但应该考虑确保磁盘不会成为瓶颈。
编辑:我会尝试这个 - > http://www.dabeaz.com/coroutines/coprocess.py