Python 3.8中的多处理器



我第一次尝试在python中使用多处理。我写了一个基本的素数搜索程序,我想在每个核心上同时运行它。问题是:当程序进行多处理时,它不仅执行"primesearch"功能,还执行代码的开头。我预期的输出是一个0到极限之间的素数列表,但它写了16次(我有16个核和16个进程("输入极限:">

这是我的代码:

import time
import os
from multiprocessing import Process
# Defining lists
primes = []
processes = []
l = [0]

limit = int(input('Enter a limit: '))
def primesearch(lower,upper):
global primes
for num in range(lower, upper):
if num > 1:
for i in range(2, num):
if (num % i) == 0:
break
else:
primes.append(num)

# Start the clock
starter = time.perf_counter()
#Dividing data
step = limit // os.cpu_count()
for x in range(os.cpu_count()):
l.append(step * (x+1))
l[-1] = limit
#Multiprocessing
for init in range(os.cpu_count()):
processes.append(Process(target=primesearch, args=[l[init], l[init + 1],] ))
for process in processes:
process.start()
for process in processes:
process.join()

#End clock
finish = time.perf_counter()

print(primes)
print(f'Finished in {round(finish-starter, 2)} second')

可能是什么问题?

您使用的是Windows-如果您阅读了用于多处理的Python文档,它将向您揭示您应该使用if __name__==“__main__”:保护您的主代码。这是因为在Windows上,每个进程都会重新执行完整的主.py文件。

这在文档中的几乎每个示例中都有使用。,并在"编程指南"末尾的一节中进行了解释。

请参阅https://docs.python.org/3/library/multiprocessing.html

除了__main__问题外,将素数用作全局列表的方法似乎不起作用。我从多处理导入了Queue,并使用了primes = Queue()

size = primes.qsize()
print([primes.get() for _ in range(size)])
primes.close()

主函数中的primes.put(num)。我不知道这是否是最好的方式,对我来说这是可行的,但如果N>12000,那么控制台就会冻结。此外,在这种情况下,使用多进程实际上比单个进程稍微慢一些。

如果你的目标是速度,你可以只测试num的平方根,这可以节省大约一半的时间。你可以做很多优化。如果你正在测试巨大的数字,你可以使用Rabin-Miller算法。http://inventwithpython.com/cracking/chapter22.html

相关内容

  • 没有找到相关文章

最新更新