我使用 Python 执行一些算法,无论我使用哪种 Python,我尝试过许多版本,CPU 使用率最高达到 25%。为什么 Python 不利用我剩余的 CPU 资源?我将服务的优先级从正常更改为高,后来又更改为实时,中间重新启动,但没有任何变化。
有没有办法让 Python 使用 50% 甚至更多的 CPU?
答案1
很简单,您在具有 4 个逻辑核心的系统中运行单线程应用程序 - 因此,您有一个进程,使用所有核心。
您将(这并非易事)需要重写算法以使其支持多线程,或者看看是否可以在特定核心上运行 2 个或更多实例以使用更多 CPU。没有其他方法。
答案2
Python 语言早于多核 CPU,因此它本身不使用多核 CPU 并不奇怪。
此外,并非所有程序都能从多核中获益。分步进行的计算(下一步取决于上一步的结果)不会因为使用更多核心而变得更快。向量化(将相同的计算应用于大量数据)可以相对容易地使用多个核心,因为各个计算是独立的。
当你进行大量计算时,我假设你使用numpy?如果没有,请查看。这是一个用 C 编写的扩展,可以使用优化的线性代数库(如 ATLAS)。与标准 Python 相比,它可以显著加快数值计算速度。
话虽如此,但是有几种方法可以使用 Python 中的多核。
- 内置的是
multiprocessing
模块。multiprocessing.Pool
该类使用和相关方法跨多个 CPU 提供矢量化map()
。不过这里有一个权衡。如果您必须在进程之间传递大量数据,那么这种开销可能会抵消多核的优势。 - 使用合适的 numpy 版本。如果 numpy 是使用多线程 ATLAS 库构建的,那么它在处理大型问题时会更快。
- 使用扩展模块,例如数字表达式,并行 Python,核心或者哥本哈根向量字节码。
请注意,该threading
模块在这方面并不是那么有用。为了保持内存管理简单,全局解释器锁(“GIL”)强制一次只有一个线程可以执行 python 字节码。不过,像 numpy 这样的外部模块可以在内部使用多个线程。