如何从嵌套生成器“生成器中的生成器”制作简单的Python生成器?

问题描述 投票:0回答:1

我正在尝试解决“欧拉关于相似幂和的猜想”问题以获取乐趣。 有趣

我的目标如下。

  1. 使用多核
  2. 记忆效率

我快完成了,但是发电机部分有问题。

我的代码如下。

from pqdm.processes import pqdm # this is parallel package. 
from itertools import combinations_with_replacement, chain
from math import pow

max_iter = 1+4
max_a = 1000
nk_pairs = {
    (combinations_with_replacement(range(1, max_a), r=n), k)
    for k in range(1, max_iter)
    for n in range(1, k+1)
} 
# ↑↑↑↑↑↑↑ this line is the problem.

def clear_root(val, k):
    """ define val is k power of integer """
    _ = pow(val, 1/k)
    if int(_) == _:
        return True
    return False

def func(array, k):
    sum_ = sum([pow(x, k) for x in array])
    if clear_root(sum_, k):
        return array, k

pqdm(nk_pairs, func, n_jobs=24)

所有组合均由生成器生成,但是,嵌套生成器不适合并行函数。

如何使这个嵌套生成器取消嵌套?

python generator
1个回答
1
投票

pqdm
无法识别嵌套迭代器/生成器。为了实现这一点,您需要构建一个生成器,如下所示(对于示例
max_a = 100
):

from pqdm.processes import pqdm # this is parallel package.
from itertools import combinations_with_replacement
from math import pow

max_iter = 1+4
max_a = 100

def nk_pairs_gen():
    for k in range(1, max_iter):
        for n in range(1, k + 1):
            for c in combinations_with_replacement(range(1, max_a), r=n):
                yield (c, k)

def clear_root(val, k):
    """ define val is k power of integer """
    _ = pow(val, 1/k)
    return int(_) == _

def func(arr, k):
    if clear_root(sum(pow(x, k) for x in arr), k):
        return arr, k

res = pqdm(nk_pairs_gen(), func, n_jobs=12, argument_type='args')

输出:

QUEUEING TASKS | : 4598121it [01:34, 48869.83it/s]
PROCESSING TASKS | : 100%|██████████| 4598121/4598121 [11:28<00:00, 6679.72it/s]
COLLECTING RESULTS | : 100%|██████████| 4598121/4598121 [01:09<00:00, 65887.49it/s] 
© www.soinside.com 2019 - 2024. All rights reserved.