在Python中在同一点快速评估许多函数



问题:在Python3中,我需要一种非常快速的方法来在同一个参数中评估许多(成千上万)函数。因此,从某种意义上说,我需要与NumPy's广播相反的方法,它允许在多个点快速评估一个

我的解决方案:目前,我只是将函数存储在一个列表中,然后使用经典的for循环迭代列表,以单独评估所有函数。然而,这太慢了。

非常欢迎示例、想法和包链接。

编辑:人们问功能是什么样子的:1。它们本质上是计算性的。无I/O。2.它们只涉及通常的代数运算,如+、-、*、/和**,还有一个指示函数。所以没有三角函数或其他特殊函数。

如果函数是IO绑定的(意味着它们大部分时间都在等待某个IO操作完成),那么使用多个线程可能是一个公平的解决方案。

如果你的函数是CPU绑定的(这意味着它们大部分时间都在做实际的计算工作),那么多个线程对你没有帮助,除非你使用的是没有全局解释器锁的python实现。

您可以在这里使用多个python进程。最简单的解决方案是multiprocessing模块。这里有一个例子:

#!/usr/bin/env python3
from multiprocessing import Pool
from functools import reduce
def a(x):
        return reduce(lambda memo, i: memo + i, x)
def b(x):
        return reduce(lambda memo, i: memo - i, x)
def c(x):
        return reduce(lambda memo, i: memo + i**2, x)
my_funcs = [a, b, c]
#create a process pool of 4 worker processes
pool = Pool(4)
async_results = []
for f in my_funcs:
        #seconds parameter to apply_async should be a tuple of parameters to pass to the function
        async_results.append(pool.apply_async(f, (range(1, 1000000),)))
results = list(map(lambda async_result: async_result.get(), async_results))
print(results)

这种方法允许您并行使用所有的CPU功率:只需选择一个与环境中CPU数量匹配的池大小。这种方法的局限性在于,所有函数都必须是可拾取的。

通过在多个线程中运行线程来评估它们,只要它们没有资源冲突。

http://www.tutorialspoint.com/python/python_multithreading.htm

最新更新