在寻找可用于并行执行“通用” python函数的“黑匣子”工具之前,我建议先分析一下如何my_function()
手动进行并行化。
首先,将的执行时间my_function(v)
与python for
循环开销进行比较:[C] Python for
循环非常慢,因此花费的时间my_function()
可以忽略不计。
>>> timeit.timeit('pass', number=1000000)
0.01692986488342285
>>> timeit.timeit('for i in range(10): pass', number=1000000)
0.47521495819091797
>>> timeit.timeit('for i in xrange(10): pass', number=1000000)
0.42337894439697266
第二次检查是否存在my_function(v)
不需要循环的简单向量实现:F[:] = my_vector_function(X)
(这两点很不重要,如果我在这里提到它们只是为了完整性,请原谅我。)
至少对于CPython实现而言,第三点也是最重要的一点是检查my_function
大部分时间是否花费在全局解释器锁(即GIL)之内或之外。如果在GIL之外花费时间,则应使用标准库模块。(这里是一个例子)。顺便说一句,人们可能会认为只是为了发布GIL而将其编写为C扩展。threading
my_function()
最后,如果my_function()
不释放GIL,则可以使用multiprocessing
模块。
参考资料:有关并行执行的Python文档,以及有关并行处理的numpy / scipy介绍。