9

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

4

2 回答 2

20

CPython 中多线程的最大问题是全局解释器锁 (GIL)(请注意,其他 Python 实现不一定有这个问题!)

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

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

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

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

于 2011-06-22T11:36:22.277 回答
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 VM 对 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

于 2013-10-27T23:25:59.457 回答