使用cython进行缓慢的多处理

时间:2014-04-22 00:29:33

标签: python performance multiprocessing cython

我目前正在研究基于python的ai minmax树。为了从ai中挤出额外的性能,我一直在使用cython来优化瓶颈,并试图对树的构建进行多处理。

我遇到的问题是当使用cython进行多处理时,ai实际上更慢。我知道多处理会产生开销,这有时会导致它变慢。但是,使用cython时它只会慢一些。当使用等效的python代码时,多处理提供2-3倍的性能提升。

我已经进行了多次测试以排除任何明显的问题。例如,我在启用和不启用alpha-beta修剪的情况下运行测试(在某些情况下可以在没有多处理的情况下执行得更好),但它没有任何区别。我已经将cython对象设置为pickleable,并且多处理的cython ai构建了一个合适的树。我正在使用的多处理实现(仅将根子项传递给pool.map函数)提高性能,但仅在使用纯python代码时。

我错过了一些针对cython的怪癖吗?使用多重处理的cython代码(或一般的c扩展)的一些额外开销?或者这是cython本身的问题吗?

编辑:以下是一些示例时间:

  

给定深度为7且没有Alpha-Beta修剪:(所有时间均为秒)

     

Cython,无多处理:
  12.457

     

Cython,多处理:
  15.440

     

没有Cython,没有多处理:
  26.010

     

没有Cython,多处理:
  17.609

经过大量测试后,我发现了开销的原因。 @Veedrac是正确的,因为c扩展有额外的开销,而python的缓慢掩盖了没有cython的开销。具体而言,从多个处理器返回分支并将它们添加到根节点时发生开销。这解释了为什么开销不是恒定的,并且实际上随着树的深度增加而放大。

我实际上已经怀疑过这个,并且之前已经过测试。但是,看起来我之前用于测试此开销的代码被窃听了。我现在已经修复了多处理以仅返回必要的信息,并且已经消除了开销。具有多处理功能的Cython现在运行得非常快。

1 个答案:

答案 0 :(得分:2)

如果你在C和Python类型之间过多地使用,那么Cython可能会有翻译成本。还有一个事实是Python中的加速会更高,隐藏开销。

一个建议是使用nogil函数,看看threading的开销是否较低。