[英]Multiprocessing in Python to find prime numbers
在 Python 3 我有这个任务,我需要使用多处理在区间[a,b]
中找到质数。
让我们以间隔 [0,30] 为例,使用 3 个进程,我有三个间隔[ai,bi]
: [0.10]
, [10,20]
, [20,30]
这是我的代码:
import multiprocessing
import time
def isprime(num):
if num > 1:
for i in range(2, num):
if (num % i) != 0:
pass
else:
return num
if __name__ == "__main__":
pool = multiprocessing.Pool(3)
start_time = time.perf_counter()
result = pool.map(isprime, range(0,30))
finish_time = time.perf_counter()
print(f"Program finished in {finish_time-start_time} seconds")
print(result)
这是预期的出口:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
这就是我得到的:
[None, None, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
你有三个问题:
isprime
function 将隐式返回None
for arguments <= 1 但否则将始终执行您的for
语句的else
子句并返回传递的参数。isprime
将返回传递的参数(如果它是素数)或None
(如果不是),那么您需要从isprime
中过滤掉None
返回值。import multiprocessing
import time
def isprime(num):
if num < 2:
return None
for i in range(2, num):
if (num % i) == 0:
return None
else:
return num
if __name__ == "__main__":
pool = multiprocessing.Pool(3)
start_time = time.perf_counter()
result = list(filter(lambda x: x is not None, pool.map(isprime, range(0,30))))
finish_time = time.perf_counter()
print(f"Program finished in {finish_time-start_time} seconds")
print(result)
印刷:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
普通的留言
您的isprime
function 可以大大改进(做一个更好的实施谷歌)。 例如:
def isprime(num):
from math import sqrt, floor
if num < 2: return None
if num == 2: return num
if num % 2 == 0: return None
for d in range(3, floor(sqrt(num)) + 1, 2):
if num % d == 0: return None
return num
但是正如您所见,随着参数n
的增加,主循环需要进行更多次迭代才能证明传递的参数是素数。
处理这个问题的方法是实现某种版本的Eraosthenes算法,它可以有效地生成一系列素数,然后您将传递给这个 function 一个范围内的数字,function 将返回所有的数字它在该范围内找到的素数。 当然,你会把你的初始range(0, 30)
分成 3 个子范围的列表,即[range(0, 10), range(10, 20), range(20, 30)]
,这将是传递给您的map
方法。
但是即使是标准的 Sieve 算法也必须开始生成以 2 开头的素数,因此即使您将参数range(10, 20)
传递给它,function 也必须重复在参数range(0, 10)
为被通过。
因此,多次调用isprime
方法对于查找一系列素数而言效率不高,但 Sieve 算法从多处理实现中没有任何收获(多处理实际上会损害性能)。 解决此问题的最佳方法是使用非多处理 Sieve。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.