Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用cython进行慢速多处理_Python_Performance_Multiprocessing_Cython - Fatal编程技术网

Python 用cython进行慢速多处理

Python 用cython进行慢速多处理,python,performance,multiprocessing,cython,Python,Performance,Multiprocessing,Cython,我目前正在用python开发一个基于minmax树的ai。为了从人工智能中挤出额外的性能,我一直在使用cython优化瓶颈,并尝试对树构建进行多处理 我的问题是,当使用cython进行多处理时,ai实际上速度较慢。我知道多处理会带来开销,这有时会导致速度变慢。不过,使用cython时速度会慢一些。当使用等效的python代码时,多处理可将性能提高2-3倍 我已经运行了几个测试来排除任何明显的问题。例如,我已经在启用和不启用alpha-beta修剪的情况下运行了测试(在某些情况下,如果不启用多处理

我目前正在用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,无多处理:
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对象?