由于 Python 在 GIL 方面存在一些问题,因此 Java 更适合开发多处理应用程序。您能否以您的方式证明 java 比 python 有效处理的确切原因?
2 回答
CPython 中多线程的最大问题是全局解释器锁 (GIL)(请注意,其他 Python 实现不一定有这个问题!)
GIL 是一个实现细节,可有效防止Python 中单独线程的并行(同时)执行。问题是每当要执行 Python 字节码时,当前线程必须已获取 GIL,并且在任何给定时刻只有单个线程可以拥有 GIL。
因此,如果 5 个线程试图执行一些 Python 字节码,那么它们将有效地交错运行,因为每个线程都必须等待 GIL 可用。这通常不是单核计算机的问题,因为物理限制具有相同的效果:一次只能运行一个线程。
然而,在多核/SMP 计算机中,这成为了瓶颈。如今,几乎所有东西都在多个内核上运行,实际上包括所有智能手机甚至许多嵌入式系统。
Java没有这样的限制,所以多个线程可以同时执行。
我不同意 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 可能会更快。
- 查看http://c2.com/cgi/wiki?PythonProblems以获取有关其中一些问题的更多讨论。
我会说我已经决定在新代码中几乎 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