【问题标题】:Multiprocessing for the recursive function value generator递归函数值生成器的多处理
【发布时间】:2018-06-25 17:00:55
【问题描述】:

我有一个简单的递归函数和它的值生成器:

def rec(n):
    if n == 1:
        return 1
    else:
        return n + rec(n-1)

lis=[]    
for i in range(1,1000):
    lis.append(rec(i))

输出:

[1, 3, 6, 10, 15, 21, 28, 36,...]

在这样的构造中可以使用多处理吗?

【问题讨论】:

  • 你使用这样的递归函数有什么原因吗?
  • 不完全一样,但类似于它更复杂的问题,因为可能解释复杂,这里不需要。
  • 与其从n 降到1,不如从1 降到n,一路顺势而为?你的例子可以用itertools.accumulate
  • 在考虑多处理之前,我会尝试编写一个更高效的算法。这个问题及其同类问题可能有一个封闭形式的解决方案或使用dynamic programming 有效解决

标签: python recursion multiprocessing generator


【解决方案1】:

你在这里描述的是一个 clean map:你将一个可迭代的值映射到一个值列表,这样 xi在原始列表中,映射到结果中的 f(xi)

我们可以用Pool:

from multiprocessing import Pool

def rec(n):
    if n == 1:
        return 1
    else:
        return n + rec(n-1)

pool = Pool(4)

lis = pool.map(rec, range(1,1000))

这里的4 是处理请求的进程数。通常这是核心数(或核心数的倍数)。

但请注意,在您的情况下,您可以将 rec 函数替换为:

# fast implementation
def rec(n):
    return n*(n+1)//2

【讨论】:

  • 谢谢。我认为使用递归函数会更复杂:)
猜你喜欢
  • 1970-01-01
  • 2012-04-06
  • 2016-04-03
  • 1970-01-01
  • 2020-09-07
  • 2023-03-24
  • 2015-05-14
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多