Python解释器仅使用12%的CPU运算能力

我在Ubuntu上使用Python进行文本分析。尽管程序在进行大量工作,但系统监视器显示的CPU使用率始终保持在12%。
我将程序的优先级从“普通”改为“非常高”,但没有效果。
是什么限制了我的Python程序可以获得的CPU使用率,并且我如何更改以便程序可以利用更多的CPU计算能力?
2个回答

我假设你有一个带有8个虚拟核心的CPU(可能是四核超线程)?这意味着一个完全负载的CPU线程/虚拟核心等于总负载的12.5%。

Python解释器默认情况下只作为一个单一进程运行的应用程序,因此不能利用多个虚拟核心。即使您使用它运行的代码使用了多线程,由于全局解释器锁(GIL (global interpreter lock)),它仍然只使用一个CPU线程/虚拟核心。

只有当您的Python程序使用multiprocessing时,实际上启动多个Python解释器实例并让它们真正并行执行任务时,您才能充分利用多个虚拟核心/CPU线程。(正如@SargeBorsch在他的评论中指出的那样,也有一些高级方法可以在没有多进程的情况下实现这一点,但通常不是您自己快速编写的东西。)


1那其实很有道理。是的,我有一个四核心的处理器,有4个物理核心(8个虚拟核心)。谢谢。 - Matthias Herrmann
9@MatthiasHerrmann 您可以考虑使用系统监视器来显示每个CPU的运行百分比。这样,您就可以看到只有8个CPU中的1个处于100%。以下是关于此主题的一个AU线程:Windows“小工具”等效(用于wifi和cpu使用情况)? - WinEunuuchs2Unix
7不对,可以很好地使用单个Python进程的所有核心。只需要调用C代码并释放GIL即可。许多现有的库就是这样做的(例如numpy)。 - Display Name
2或者使用JythonIronPython,它们没有全局解释器锁(GIL)。 - OrangeDog

另一种可能性,在这种情况下不太可能发生的是,程序受到磁盘限制,即它正在读写磁盘,而磁盘速度较慢,导致CPU在等待磁盘操作。

5尝试使用iotop来监控与I/O等待相关的程序。 - cat
1代码本身是同步阻塞的。 - Zydnar