我编写了一个程序,该程序根据Lucas-Lehmer序列确定梅森素数是素数还是素数。我想使用多处理和/或多线程来减少检查素数所需的时间,因此我在此处和在Youtube上研究了其他帖子和教程,但是这些示例通常使用截然不同的实现;无论他们使用的是“线程”模块还是“线程”模块,并且通常仅具有一个功能。我该如何并行执行我的2个功能;这需要花费不同的时间来计算,并且需要将计算返回到第三函数以得到最终结果。(请注意,我最近才开始编程)。我知道我可以对算法本身进行优化。如果Mersenne素数的最后一位是偶数或5,那么它应该只打印素数,但我要特别关注并行化。谢谢。代码:
def Checker(pm_n=(2, 4)):
pm, n = pm_n
lls = (n ** 2 - 2)
lls = n
lls = (n ** 2 - 2)
mp = (2 ** pm - 1)
pm = pm + 1
mp = (2 ** pm - 1)
if (lls % mp == 0):
return True
else:
return False
使用并行代码,我将3个功能简化为一个:
{{1}}
如果名称 =='主要”: 从多处理导入池 将Pool(4)作为池: pm1 = 2 n1 = 4 pm2 = 3 n2 =(n1 ** 2-2) pm3 = 4 n3 =(n2 ** 2-2) pm4 = 5 n4 =(n3 ** 2-2) 结果= pool.map(检查器,[[pm1,n1),(pm2,n2),(pm3,n3),(pm4,n4)]) 打印(结果) 而True: pm1 = pm4 + 1 n1 =(n4 ** 2-2) pm2 = pm1 + 1 n2 =(n1 ** 2-2) pm3 = pm2 + 1 n3 =(n2 ** 2-2) pm4 = pm3 + 1 n4 =(n3 ** 2-2) 结果= pool.map(检查器,[[pm1,n1),(pm2,n2),(pm3,n3),(pm4,n4)]) 打印(结果)
在4个数组长的数组中,素数的输出为True,非素数的输出为False。然后,接下来的4个数字是否为素数将在数组中输出。
答案 0 :(得分:0)
不要使用线程。 Python具有全局解释器锁,因此多线程将比单线程慢。尽管您最好的选择是并行运行多个Checker
,但多处理可能会有所帮助。您发现的大多数示例都将使用多处理池。看起来像这样:
if __name__ == "__main__":
from multiprocessing import Pool
with Pool(4) as pool:
result = pool.map(Checker, [(pm1, n1), (pm2, n2), (pm3, n3), (pm4, n4)])
print(result)
这将并行运行检查程序四次。
编辑:但是,这可能仍然比串行执行慢,除非您要求在每次检查中进行大量计算。
编辑:显示如何保护多处理程序的执行。