Python 将此代码并行化
我试图找出如何并行化下面的代码。 我已经查找了Python 将此代码并行化,python,multithreading,parallel-processing,multiprocessing,concurrent.futures,Python,Multithreading,Parallel Processing,Multiprocessing,Concurrent.futures,我试图找出如何并行化下面的代码。 我已经查找了joblib、concurrent.futures和多处理模块,但我一辈子都无法通过阅读文档和搜索SO/google了解它们是如何工作的 Grid是一个定义了适当方法的类对象,它与循环的处理顺序无关 def ProcessGrid(Grid): #Parallel This Loop for i in range(len(Grid)): Grid[i].AdjustCostMultiplier() Gr
joblib
、concurrent.futures
和多处理
模块,但我一辈子都无法通过阅读文档和搜索SO/google了解它们是如何工作的
Grid
是一个定义了适当方法的类对象,它与循环的处理顺序无关
def ProcessGrid(Grid):
#Parallel This Loop
for i in range(len(Grid)):
Grid[i].AdjustCostMultiplier()
Grid[i].FindAllNeighbours(Grid)
print("Processing Grid Cell: " + str(i) + " of " + str(len(Grid)),end = "\r")
#Return to serial
return Grid
您可以像这样使用线程库:
import threading
def process(grid, i):
grid[i].AdjustCostMultiplier()
grid[i].FindAllNeighbours(Grid)
print("Processing Grid Cell: " + str(i) + " of " + str(len(grid)), end = "\r")
def ProcessGrid(Grid):
threads = []
for i in range(len(Grid)):
t = threading.Thread(target=process, args=(Grid, i))
t.start()
threads.append(t)
for t in threads:
# Wait for all threads to finish
t.join()
#Return to serial
return Grid
process()
将在每次迭代的新线程中调用t.join()
然后等待线程完成。是否要将ProcessGrid方法并行调用两次?或者您想调用AdjustCostMultiplier()和FindAllNeighbours()?我想并行化for循环,我将编辑我的问题以反映“do X for me”请求的澄清(很难将它们描述为“问题”),在这里,如果不至少显示您自己的努力,就无法得到良好的响应——不仅仅是声称您已经尝试过,但实际上是以a的形式显示您编写的代码,并描述它是如何失败的。好的,我添加了一个答案。我没有测试它,但它应该可以工作:)不幸的是,由于全局解释器锁,Python多线程在CPU受限的情况下不能使代码更快。多道处理确实使它更快,但它需要更多的努力。他要求将它并行化。他从未要求把代码写得更快。此外,如果涉及等待进程,多线程也可以使代码更快。t是“非类型”时有一些问题(我想是因为没有返回语句吧?),但我刚刚注释掉了join语句,它对我的caseoops很好,很抱歉我修复了它。我将.start()存储到t中,而不是线程本身。只需移动t.start()进入下一行。@Maarten_vd_Sande并行化可以使代码更快,如果(a)它不是CPU绑定的,或者(b)它是CPU绑定的。但是大部分工作是在C扩展库中进行的,这些扩展库为主要操作(如numpy)释放GIL,或者(C)它在无GIL的Python解释器(如Jython)中运行。