我需要创建一个对象迭代器,它接受range
输入并应用一些操作,这样就创建了素数迭代器。然后我需要将这个素数迭代器传递给某个multiprocessing
方法(可能是imap
?)所以只有在调用对象迭代器时,才能使用并行处理来计算素数。这是我的MWE:
import multiprocessing as mp
from itertools import islice
class PrimeIterator:
"""Iterator class"""
def __init__(self, input_stream, *, number_of_processes=mp.cpu_count()):
"""Initiate object"""
self.input = input_stream
self.pool = mp.Pool(number_of_processes)
def __iter__(self):
"""Return iterator"""
self.iterator = map(is_prime, self.input)
pool_iterator = self.pool.imap_unordered(pass_to_mp, self.iterator)
return pool_iterator
def __next__(self):
"""Return next item from iterator"""
try:
return next(pool_iterator)
except StopIteration:
return
def pass_to_mp(value):
time.sleep(.4)
return value
def is_prime(n):
if n < 2:
return False, n
elif n == 2:
return True, n
sqrt_n = int(n**0.5)+1
return len([i for i in range(2, sqrt_n+1) if n % i == 0]) == 0, n
PrimeIterator
可以这样测试:
list(islice(PrimeIterator(range(100), number_of_processes=10), 10))
这是输出:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
尽管我收到了正确的数据运行时间相当长。对于给定的任务,是否有更有效的multiprocesing
实现?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐