如何有效地创建使用多进程输入数据的对象迭代器?

2024-10-02 14:24:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要创建一个对象迭代器,它接受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实现?你知道吗


Tags: of对象selfnumberinputreturndefrange