这次我面临着“设计”问题。使用Python,我有一个实现数学算法,使用5个参数。为了找到这5个参数的最佳组合,我使用了5层嵌套循环来枚举给定范围内的所有可能组合。完成所需的时间似乎超出了我的预期。所以我觉得是时候使用多线程......
嵌套循环核心中的任务是计算和保存。在当前代码中,每个计算的结果都附加到列表中,列表将在程序结束时写入文件。
因为我没有太多使用任何语言的多线程经验,更不用说Python了,我想问一些关于这个问题的结构应该是什么的提示。也就是说,应该如何动态地为线程分配计算,以及线程应该如何保存结果,然后将所有结果合并到一个文件中。我希望线程的数量可以调整。
任何带代码的插图都会非常有用。
非常感谢你的时间,我很感激。
#第二天更新: 感谢所有有用的答案,现在我知道它是多处理而不是多线程。我总是对这两个概念感到困惑,因为我认为如果它是多线程的,那么OS会自动使用多个处理器来运行它。 我今晚有时间亲自动手进行多处理。
答案 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
的示例。