【问题标题】:Why Python is not better in multiprocessing or multithreading applications than Java?为什么 Python 在多处理或多线程应用程序中不如 Java?
【发布时间】:2011-06-22 11:29:17
【问题描述】:

由于 Python 在 GIL 方面存在一些问题,因此 Java 更适合开发多处理应用程序。您能否以您的方式证明 java 比 python 有效处理的确切原因?

【问题讨论】:

  • 你知道 GIL 是什么吗?
  • 这个问题是错误的。在 multiprocessing 应用程序中,GIL 不会成为问题,因为多处理 Python 应用程序将愉快地在多个内核中同时运行。 Java 在多处理方面并不比 python 更好。另一方面,多线程......

标签: java python multithreading multiprocessing gil


【解决方案1】:

CPython 中多线程的最大问题是Global Interpreter Lock (GIL)(请注意,其他 Python 实现不一定一定会遇到这个问题!)

GIL 是一个实现细节,可以有效地防止在 Python 中并行(同时)执行单独的线程。问题是,每当要执行 Python 字节码时,当前线程必须已经获得 GIL,并且在任何给定时刻只有一个线程可以拥有 GIL。

因此,如果 5 个线程试图执行一些 Python 字节码,那么它们将有效地交错运行,因为每个线程都必须等待 GIL 可用。这通常不是单核计算机的问题,因为物理限制具有相同的效果:一次只能运行一个线程。

然而,在多核/SMP 计算机中,这会成为瓶颈。如今,几乎所有东西都在多个内核上运行,实际上包括所有智能手机甚至许多嵌入式系统。

Java 没有这样的限制,所以多个线程可以同时执行。

【讨论】:

【解决方案2】:

我不同意 Python 在多处理应用程序方面并不比 Java 更好。

首先,据我所知,我假设 OP 使用“更好”来表示“更快的代码执行”。

我患有“速度狂”综合症,可能来自 C/ASM 背景,所以我花了相当长的时间来了解“Python 慢吗?”问题。

简单的答案? “有可能。”以下是一些要点:

1) 对于多线程应用程序,Python 将比任何没有类似 GIL 的语言的劣势。 GIL 是 CPython 中 Python VM 的工件,而不是 Python 语言本身。一些 Python VM,如 Jython、IronPython 等,没有 GIL。

2) 在多进程应用程序中,GIL 并不真正适用,因此您现在可以开始利用大部分不受 GIL 干扰的 Python 代码的更快执行。如果你想编写既需要速度又需要并发的大型 Python 代码,我强烈建议你学习多处理,可能还有 ZMQ/0MQ 用于消息传递。

3) 不管 GIL 是什么,Java 在许多方面都比 Python 显示出更快的代码执行速度。这是由于 Python 处理内存中对象的方式的原生差异:

  • 许多 Python 函数在内存中创建对象的副本而不是修改它们(参见 http://www.skymind.com/~ocrow/python_string/ 的示例)

  • Python 使用 Dict 来存储对象等的属性。我不想分散注意力并深入研究这些领域,但我通常可以说 Python 可以做的一些“整洁”的事情来速度成本。同样重要的是要知道,如果默认行为对您造成过高的速度损失,那么有一些方法可以绕过它。

4) 据我所知,Java 的一些速度优势是由于 Java 虚拟机对 Python 进行了更多优化。一旦消除了幕后内存/对象工作量的差异,Java 通常仍然可以击败 Python。是因为Java比Python更受关注吗?我不确定,如果有足够的资金,我觉得 CPython 可能会更快。

我会说我已经决定在新代码中几乎 100% 地拥抱 Python。

不要落入过早的优化陷阱,记住你总是可以在紧要关头调用 C 代码。让您的代码运行良好,使其可维护,然后在应用程序的速度不足以满足您的需求时开始优化。

有趣的基准测试:

http://benchmarksgame.alioth.debian.org/u64/python.php

可以在此处找到有关 Python 速度问题的更多信息:

http://www.infoworld.com/d/application-development/van-rossum-python-not-too-slow-188715

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 2021-08-30
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多