使用Python将大型嵌套循环划分为8个(或更多)进程的巧妙方法是什么?

时间:2011-07-04 22:23:05

标签: python multiprocessing

这次我面临着“设计”问题。使用Python,我有一个实现数学算法,使用5个参数。为了找到这5个参数的最佳组合,我使用了5层嵌套循环来枚举给定范围内的所有可能组合。完成所需的时间似乎超出了我的预期。所以我觉得是时候使用多线程......

嵌套循环核心中的任务是计算和保存。在当前代码中,每个计算的结果都附加到列表中,列表将在程序结束时写入文件。

因为我没有太多使用任何语言的多线程经验,更不用说Python了,我想问一些关于这个问题的结构应该是什么的提示。也就是说,应该如何动态地为线程分配计算,以及线程应该如何保存结果,然后将所有结果合并到一个文件中。我希望线程的数量可以调整。

任何带代码的插图都会非常有用。

非常感谢你的时间,我很感激。

第二天更新: 感谢所有有用的答案,现在我知道它是多处理而不是多线程。我总是对这两个概念感到困惑,因为我认为如果它是多线程的,那么OS会自动使用多个处理器来运行它。 我今晚有时间亲自动手进行多处理。

3 个答案:

答案 0 :(得分:7)

Python中的多线程不会在这类问题中赢得任何东西,因为Python不会并行执行线程(它主要用于I / O并发)。

您需要multiprocessing,或者是joblib的友好包装:

from joblib import Parallel, delayed

# -1 == use all available processors
results = Parallel(n_jobs=-1)(delayed(evaluate)(x) for x in enum_combinations())
print best_of(results)

enum_combinations将列举五个参数的所有组合;您可以通过在嵌套循环的底部放置yield来实现它。

joblib在多个工作进程上分配组合,负责一些负载平衡。

答案 1 :(得分:7)

您可以尝试使用jug,这是我为非常类似的问题编写的库。您的代码看起来像

from jug import TaskGenerator
evaluate = TaskGenerator(evaluate)

for p0 in [1,2,3]:
    for p1 in xrange(10):
        for p2 in xrange(10,20):
             for p3 in [True, False]:
                for p4 in xrange(100):
                    results.append(evaluate(p0,p1,p2,p3,p4))

现在您可以根据需要运行任意数量的进程(如果您有权访问计算机群集,甚至可以在网络中运行)。

答案 2 :(得分:3)

假设这是一个计算量大的问题(因此受CPU限制),由于GIL,多线程对Python没有多大帮助。

但是,您可以将计算分配到多个进程以利用额外的CPU核心。最简单的方法是使用multiprocessing库。

有很多关于如何在文档页面上使用multiprocessing的示例。