我写了一个程序,根据Lucas Lehmer序列来确定Mersenne素数是否为素数。我想使用多处理和/或多线程来减少检查是否素数所需的时间,因此我研究了这里和Youtube上的其他帖子和教程,然而这些例子通常使用截然不同的实现;无论它们是使用"线程"还是"线程"模块,并且通常只具有一个功能。如何并行我的两个函数;其花费不同的时间进行计算,并且需要将计算返回到第三函数以获得最终结果。(请注意,我最近才开始编程(。我知道我可以对算法本身进行优化;例如,如果梅森素数的最后一个数字是偶数或5,那么它应该只打印非素数,但我想特别关注并行。谢谢代码:
import time
def MersennePrime(pm=3):
mp = (2 ** pm) - 1
print(pm)
print(mp)
while pm <=25:
pm = pm + 1
print(mp)
def LucasLehmerSequence(n=4):
lls = (n ** 2) - 2 # Calculates the 2nd digit of the Lucas-Lehmer Sequence.
print(n)
print(lls)
while pm <= 25:
n = lls
lls = (n ** 2) - 2
print(lls)
def Checker(pm=3, n=4):
start = time.time()
mp = (2 ** pm) - 1
while pm <= 25:
lls = (n ** 2) - 2
n = lls # Updates the value of n to be = the previous sequence entry.
lls = (n ** 2) - 2
pm = pm + 1 # Adds 1 to the power of the Mersenne.
mp = (2 ** pm) - 1
if (lls % mp) == 0: # If nth in sequence has a remainder of 0 when / by the nth Mersenne it is a Mersenne Prime.
print(str(mp) + ' is prime.')
else:
print(str(mp) + ' is not prime')
end = time.time()
print(end - start)
print(Checker())
通过并行代码,我将3个功能简化为一个:
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
如果name='main':来自多处理导入池以池(4(作为池:pm1=2n1=4pm2=3n2=(n1**2-2(pm3=4n3=(n2**2-2(pm4=5n4=(n3**2-2(result=pool.map(Checker,[(pm1,n1(,(pm2,n2(,(pm3,n3(,(pm 4,n4(](打印(结果(而True:pm1=pm4+1n1=(n4**2-2(pm2=pm1+1n2=(n1**2-2(pm3=pm2+1n3=(n2**2-2(pm4=pm3+1n4=(n3**2-2(result=pool.map(Checker,[(pm1,n1(,(pm2,n2(,(pm3,n3(,(pm 4,n4(](打印(结果(
在长度为4的数组中,"输出"将为True表示素数,而为False表示非素数。然后,接下来的4个数字是否为素数将以数组形式输出。
不要使用线程。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)
这将并行运行检查器四次。
编辑:但是,这可能仍然比串行执行慢,除非您要求在每次检查中进行大量计算。
编辑:展示如何保护多处理程序的执行。