使用Cython的多进程速度慢

1 投票
1 回答
1960 浏览
提问于 2025-04-18 03:40

我现在正在用Python开发一个基于最小最大树的人工智能。为了提高人工智能的性能,我使用了Cython来优化性能瓶颈,并尝试对树的构建进行多进程处理。

我遇到的问题是,当使用Cython进行多进程处理时,人工智能的速度反而变慢。我知道多进程处理会有一些额外的开销,这有时会导致速度变慢。但是,只有在使用Cython时才会变慢。当使用相同的Python代码时,多进程处理的性能提升可以达到2到3倍。

我进行了多次测试,以排除明显的问题。例如,我测试了启用和不启用Alpha-Beta剪枝的情况(在某些情况下,可能在没有多进程的情况下表现更好),但结果没有区别。我已经设置了Cython对象可以被序列化,并且多进程的Cython人工智能能够正确构建树。我使用的多进程实现(只将根节点的子节点传递给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时的开销。具体来说,开销发生在从多个处理器返回分支并将其添加到根节点时。这解释了为什么开销不是恒定的,实际上随着树的深度增加而增加。

我之前其实怀疑过这个问题,并进行了测试。然而,我之前用来测试这个开销的代码有bug。现在我已经修复了多进程,只返回必要的信息,开销也消除了。现在Cython与多进程的组合运行得非常快。

1 个回答

3

Cython在C和Python类型之间频繁转换时可能会产生一些额外的开销,这可能会影响性能。此外,Python的速度提升会更明显,这样就会掩盖这些额外开销。

一个建议是使用nogil函数,看看使用threading时是否会有更低的开销。

撰写回答