为什么我的Python程序每个进程平均只有33%的CPU?如何让Python使用所有可用的CPU?

时间:2009-11-16 16:33:15

标签: python performance process multiprocessing cpu-usage

我使用Python 2.5.4。我的电脑:CPU AMD Phenom X3 720BE,主板780G,4GB RAM,Windows 7 32位。

我使用Python线程但不能使每个python.exe进程消耗100%的CPU。为什么他们平均只使用33-34%?

我希望将所有可用的计算机资源用于这些大型计算,以便尽快完成。

编辑: 谢谢大家。现在我使用的是Parallel Python,一切运行良好。我的CPU现在总是100%。谢谢大家!

7 个答案:

答案 0 :(得分:33)

看来你有一个3核CPU。如果要在本机Python代码中使用多个CPU内核,则必须生成多个进程。 (两个或多个Python线程不能在不同的CPU上并发运行)

作为 R。 Pate 说,Python的multiprocessing模块是单向的。不过,我建议改为查看 Parallel Python 。它负责分发任务和消息传递。您甚至可以在许多单独的计算机上上运行任务,而对代码的更改很少。

使用它非常简单:

import pp

def parallel_function(arg):
    return arg

job_server = pp.Server() 

# Define your jobs
job1 = job_server.submit(parallel_function, ("foo",))
job2 = job_server.submit(parallel_function, ("bar",))

# Compute and retrieve answers for the jobs.
print job1()
print job2()

答案 1 :(得分:25)

尝试multiprocessing模块,就像Python一样,虽然它有真正的本机线程,但在GIL被保持时会限制它们的并发使用。另一种选择,如果你需要真正的速度,你应该看一下,就是编写C扩展模块并从Python中调用函数。您可以在这些C函数中释放GIL。

另请参阅David BeazleyMindblowing GIL

答案 2 :(得分:11)

Global Interpreter Lock

  

使用这种锁的原因包括:

* increased speed of single-threaded programs (no necessity to acquire or release locks
  on all data structures separately)
* easy integration of C libraries that usually are not thread-safe.
     

用语言编写的应用程序   GIL必须使用单独的进程   (即口译员)实现全面   并发性,就像每个解释器一样   它自己的GIL。

答案 3 :(得分:1)

从CPU使用情况看,您仍然在单核上运行。尝试使用具有相同线程代码的3个或更多线程运行一个简单的计算,看看它是否使用了所有内核。如果没有,那么您的线程代码可能有问题。

答案 4 :(得分:1)

Stackless Python怎么办?

答案 5 :(得分:0)

你的瓶颈可能在其他地方,比如硬盘(分页)或内存访问。

答案 6 :(得分:0)

您应该执行一些操作系统和Python监控来确定瓶颈的位置。

以下是Windows 7的一些信息:

性能监视器:您可以使用Windows性能监视器来检查运行的程序如何实时影响计算机的性能,以及收集日志数据以供以后分析。 ( 控制面板 - >所有控制面板项目 - >性能信息和工具 - >高级工具 - >查看性能监视器)

资源监视器:Windows资源监视器是一个系统工具,允许您查看有关硬件(CPU,内存,磁盘和网络)和软件(文件句柄和模块)资源使用的信息实时。您可以使用资源监视器来启动,停止,暂停和恢复进程和服务。 ( 控制面板 - >所有控制面板项目 - >性能信息和工具 - >高级工具 - >查看资源监视器