【问题标题】:Run the same function with the same arguments 10 times and get results使用相同的参数运行相同的函数 10 次并获得结果
【发布时间】:2015-04-09 21:23:13
【问题描述】:

我正在寻找最聪明的方法,用相同的参数运行 10 次相同的函数并存储结果。

直接的解决方案是:

def f(a):
    // do stuff
    return a

results = []
same_argument = 10

for x in range(0,10):
    results.append(f(same_argument))

这可行,但我相信如果这 10 个进程可以同时运行,则该进程将花费更少的时间。

The multi-process map function 似乎可以完成这项工作,但它只需要一个可迭代的参数。我可以将相同参数的 10 倍的列表传递给它,但感觉不对。

是否有其他内置方法可以处理我的问题?

【问题讨论】:

  • python3 可以使用生成器表达式with Pool(10) as p:results = p.map(f, (same_argument for _ in range(10)))

标签: python multithreading concurrency multiprocessing


【解决方案1】:

我只会使用 pool 并多次传递相同的参数...

n_times = 10
results = pool.map(f, [same_argument] * n_times)

它很快,很容易判断发生了什么。唯一的缺点是它需要一点中间存储空间 - 与保存实际结果所需的存储量相比,这可能可以忽略不计。

当然,如果你真的担心存储开销,你应该可以使用itertools.repeat(same_argument, n_times)...

【讨论】:

  • @JoshuaTaylor -- pool.map(f, (arg for _ in xrange(n)) 可以工作(显然需要对 py3k 进行修改)。我建议使用itertools.repeat 的不同替代方案,但同样,对于合理数量的n,中间存储可能不是问题。您甚至没有在这里创建新对象——只有更多的引用占用了与指针一样多的内存(每个约 8 字节)......
【解决方案2】:

列表理解呢?

results = [f(same_argument) for _ in xrange(10)]

“_”用于使语法验证工具(如 pylint)不会抱怨未使用的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2021-02-27
    • 2018-07-19
    相关资源
    最近更新 更多