我正在尝试解决“欧拉关于相似幂和的猜想”问题以获取乐趣。 有趣。
我的目标如下。
我快完成了,但是发电机部分有问题。
我的代码如下。
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)
所有组合均由生成器生成,但是,嵌套生成器不适合并行函数。
如何使这个嵌套生成器取消嵌套?
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]