【问题标题】:Why does my Python program average only 33% CPU per process? How can I make Python use all available CPU?为什么我的 Python 程序平均每个进程只占用 33% 的 CPU?如何让 Python 使用所有可用的 CPU?
【发布时间】:2010-12-17 03:06:42
【问题描述】:

我使用 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%。谢谢大家!

【问题讨论】:

    标签: python performance process multiprocessing cpu-usage


    【解决方案1】:

    您的瓶颈可能在其他地方,例如硬盘驱动器(分页)或内存访问。

    【讨论】:

    • 仅供参考,内存 (RAM) 访问将计入 CPU 使用百分比,因为 CPU 正忙于等待。所以这不可能是原因。
    • 这很可能是 3 核机器上的 GIL 相关问题,而不是内存或磁盘访问问题。
    • 是的.. 我有 8 个内核,每个辛勤工作的 pythonw.exe 进程的 %CPU 使用率是 12.5 = 100/8
    【解决方案2】:

    试试multiprocessing 模块,因为Python 虽然它有真正的本地线程,但在GIL 被持有时会限制它们的并发使用。如果您需要真正的速度,另一种选择是编写一个 C 扩展模块并在其中从 Python 调用函数。您可以在这些 C 函数中释放 GIL。

    另见David Beazley的Mindblowing GIL。

    【讨论】:

    • 感谢您的链接。我不知道它有那么糟糕。
    【解决方案3】:

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

    【讨论】:

    • 问题不在于他的线程代码;由于 GIL,Python 无法执行真正的并发操作,即使它具有多线程。因此,它一次只能使用一个核心。
    • qid:不正确! C 扩展模块中的代码可以释放 GIL 并在其他线程同时运行时做一些工作。
    • 我的 CPU 使用 3 个内核,负载相同
    【解决方案4】:

    您的 CPU 似乎是 3 核。如果要在原生 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()
    

    【讨论】:

    • 不准确,您可以在不持有 GIL 的情况下运行线程。
    • 出于实用目的,所有原生 Python 代码将始终持有 GIL。
    • 使用扩展模块非常实用,至少对我来说是这样。 (不过,我仍然赞成 PP 参考。:)
    【解决方案5】:

    您应该执行一些操作系统和 Python 监控以确定瓶颈在哪里。

    以下是 Windows 7 的一些信息:

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

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

    【讨论】:

      【解决方案6】:

      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。

      【讨论】:

      • 为什么我被否决了?这给出了“为什么他们平均只使用大约 33-34%?”的正确答案,并且它还在下面给出了一个解决方案......真的有必要否决吗?甚至所选答案的第一句话也与此解决方案相匹配。
      • 当悬停在上/下投票箭头上时,替代文字很清楚:“这个答案有用/没用”。愚蠢的是,似乎许多 SO 用户改为阅读“我喜欢这个答案/我不喜欢这个答案,这个人应该死得很惨”,并相应地投票。如果我不得不否决一个答案,我会否决 nicholaides 的答案,但我不能,因为他是对的(尽管我坚信他不是)。
      【解决方案7】:

      【讨论】:

      • Stackless python 也有同样的限制。不使用传统线程并不意味着 GIL 消失了。
      猜你喜欢
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多