如何增加Python的CPU使用率


21

我使用Python执行某些算法,无论我使用哪个Python,并且尝试了许多版本,CPU使用率最高都达到25%。为什么Python不利用我的其余CPU资源?我将服务的优先级从正常更改为高,然后将其更改为实时,并在两次重新启动之间进行了更改,但没有任何改变。

有没有办法让Python使用50%甚至更多的CPU?


您的CPU是多核CPU吗?
Journeyman Geek

是的,它是i5-480M,并且在控制面板>电源选项> cpu最小值/最大值中为100%
Christos K.

Answers:


20

简而言之,您正在具有4个逻辑核心的系统中运行一个单线程应用程序-这样,您就拥有了一个使用所有核心的进程。

您将(并且这很简单)需要将算法重写为多线程,或者查看是否只能在特定内核上运行2个或更多实例以使用更多CPU。没有别的办法了。


我担心情况会如此,但是在Windows任务管理器中的cpu使用图中,我看不到在执行算法时选择1张图,相反,我看到所有这些图都有明显的增加。
Christos K.

1
您的系统正在平衡内核之间的负载。仍然没有一次使用两个内核。
gronostaj

你们证实了我的担心,看来现在该是我开始阅读有关线程的时候了
Christos K.

@ fractal_7:线程化可能不会带来您期望的收益。请参阅下面的答案。
罗兰·史密斯

15

Python语言早于多核CPU,因此并不本地使用它们就不足为奇了。

此外,并非所有程序都可以从多个内核中受益。分步进行的计算(下一步取决于上一步的结果)将不会使用更多核来加快计算速度。可以向量化的问题(将相同的计算应用于大型数据数组)可以相对容易地使用多个核,因为各个计算是独立的。

当您进行大量计算时,我假设您正在使用numpy?如果没有,请检查一下。它是用C编写的扩展,可以使用优化的线性代数库(如ATLAS)。与标准Python相比,它可以大大加快数值计算的速度。

话虽如此,有几种方法可以在python中使用多个内核。

  • 内置multiprocessing模块。本multiprocessing.Pool类提供跨越与多个CPU的矢量map()和相关方法。但是这里需要权衡。如果您必须在进程之间传递大量数据,那么这种开销可能会抵消多核的优势。
  • 使用合适的numpy版本。如果numpy是使用多线程ATLAS库构建的,则在处理大问题时会更快。
  • 使用扩展模块,例如numexpr并行pythoncorepyCopenhagen Vector Byte Code

请注意,threading模块在这方面并不是很有用。为了简化内存管理,全局解释器锁(“ GIL”)强制一次只能有一个线程在执行python字节码。不过,像numpy这样的外部模块可以在内部使用多个线程。


到目前为止,我已经使用python 2.7 ironpython并尝试了pypy。我会给numpy一个机会。但是,在使用任何多处理模块之前,我仍然必须先阅读。
Christos K.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.