Python 用cython进行慢速多处理
我目前正在用python开发一个基于minmax树的ai。为了从人工智能中挤出额外的性能,我一直在使用cython优化瓶颈,并尝试对树构建进行多处理 我的问题是,当使用cython进行多处理时,ai实际上速度较慢。我知道多处理会带来开销,这有时会导致速度变慢。不过,使用cython时速度会慢一些。当使用等效的python代码时,多处理可将性能提高2-3倍 我已经运行了几个测试来排除任何明显的问题。例如,我已经在启用和不启用alpha-beta修剪的情况下运行了测试(在某些情况下,如果不启用多处理,性能会更好),但这没有什么区别。我已经将cython对象设置为可pickle,多进程cython ai构建了一个适当的树。我正在使用的多处理实现(仅将根子级传递给pool.map函数)确实提高了性能,但仅当使用纯python代码时 我错过了cython的一些怪癖吗?在多处理中使用cython代码(或通常的c扩展)会带来额外的开销吗?或者这是cython本身的问题 编辑:以下是一些计时示例: 给定深度为7且无Alpha-Beta修剪:(所有时间以秒为单位) Cython,无多处理:Python 用cython进行慢速多处理,python,performance,multiprocessing,cython,Python,Performance,Multiprocessing,Cython,我目前正在用python开发一个基于minmax树的ai。为了从人工智能中挤出额外的性能,我一直在使用cython优化瓶颈,并尝试对树构建进行多处理 我的问题是,当使用cython进行多处理时,ai实际上速度较慢。我知道多处理会带来开销,这有时会导致速度变慢。不过,使用cython时速度会慢一些。当使用等效的python代码时,多处理可将性能提高2-3倍 我已经运行了几个测试来排除任何明显的问题。例如,我已经在启用和不启用alpha-beta修剪的情况下运行了测试(在某些情况下,如果不启用多处理
12.457 Cython,多处理:
15.440 无Cython,无多处理:
26.010 无Cython,多处理:
17.609 经过多次测试,我找到了开销的原因@Veedrac是正确的,因为c扩展有额外的开销,而python的缓慢掩盖了没有cython的开销。具体来说,当从多个处理器返回分支并将其添加到根节点时,会产生开销。这就解释了为什么开销不是恒定的,实际上随着树的深度增加而增加
事实上,我已经怀疑了这一点,并在之前进行了测试。然而,我之前用于测试此开销的代码似乎有错误。我现在修复了只返回必要信息的多处理,并且消除了开销。具有多处理功能的Cython现在运行得非常快。如果在C和Python类型之间切换太多,Cython可能会有翻译成本,这可能会造成问题。还有一个事实是Python中的加速比会更高,这隐藏了开销
一个建议是使用
nogil
函数,看看threading
是否有较低的开销。你看了吗?@Schollii我试过分析多处理代码,但它似乎不能很好地处理多处理。它只是显示thread.lock占用了所有程序的时间。@PaintingAir看看如何使用Cython的prange()
包装的openMP函数,不幸的是,我尝试多线程处理的部分大量使用python对象,没有gil就无法访问或修改。什么类型的Python对象?