我一直在开发一种算法来解决一个Boggle board,WebBoggle。我已经成功地使用了python3,但我现在正试图优化它,使其尽可能快地工作,我想使用多线程或多处理来实现加速
我认为这可以很好地体现在算法开头的for
循环中,该循环反复调用重载函数,如下所示:
nodes = [{obj1}, {obj2}, {obj3}, ... , {obj16}]
word_tree = {"children": {"A": {"data": "A", "children" :{...}}, "B": {"data": "B", "children": {...}}, ...}}
def doSomeWork():
found_words = []
for i in range(15):
found_values += doHeavyLifting(nodes[i], word_tree.children["A"])
return found_words
在这种情况下nodes
数组在算法期间是静态的,可以将其视为只读的,每个进程或线程都可以安全地读取它,而不必担心竞争条件或锁定
但是word_tree
对象(希望上面清楚地描述了它)是由doHeavyLifting
函数修改的,但是是分段的,即word_tree
中有许多nodes
,如果需要锁,它将在单个node
上获得,而不是在整个word_tree
上,例如该函数可能会改变节点a的某些内容,但它不需要对节点a的子节点(对这些子节点的引用存储在节点a的children
dict中)进行锁定
最终doHeavyLifting
的返回值存储在found_words
数组中,并在处理完所有nodes
后返回。(doHeavyLifting
是一个递归函数,但我不确定这对这个问题有什么影响…)
我从来没有在Python中使用过多线程,也从来没有使用过多处理,我想知道如何实现这个循环,使用16个CPU线程,可以同时处理nodes
数组中的每个元素(或者在系统资源允许的情况下进行类似处理),以及doSomeWork
函数将返回的单个返回值存储在一个变量中
谢谢
目前没有回答
相关问题 更多 >
编程相关推荐