为什么Python在多处理或multithreading应用程序中不比Java好?

由于Python在GIL方面存在一些问题,因此Java更适合开发多处理应用程序。 你能否以自己的方式certificatejava的有效处理的确切推理?

CPython中multithreading的最大问题是全局解释器锁(GIL) (注意其他Python实现不一定分享这个问题!)

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

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

然而,在多核/ SMP计算机中,这成为瓶颈(并且每分钟变得越来越普遍)。

Java没有这样的限制,因此多个线程可以在同一时间执行。

我不同意Python对于Multi-Processing应用程序并不比Java好。

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

我患有’速度怪胎’综合症,可能是因为来自C / ASM背景,所以我花了相当多的时间来深入研究“Python慢​​吗?” 问题。

这简单的答案? “有可能。” 这里有一些重点:

1)使用multithreading应用程序,Python对任何与GIL没有类似function的语言都会处于劣势。 GIL是CPython中Python VM的工件,而不是Python语言本身。 一些Python VM如Jython,IronPython等没有GIL。

2)在Multi-Process应用程序中,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上的更多优化。 一旦消除了幕后内存/对象工作量的差异,Java通常仍然可以击败Python。 是因为Java比Python更受关注吗? 我不确定,有足够的资金我觉得CPython会更快。

  • 查看http://c2.com/cgi/wiki?PythonProblems以获取有关其中一些问题的更多讨论。

我会说我已经决定接受Python近100%的新代码。

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

有趣的基准:

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

有关Python速度问题的更多信息,请访问:

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

我想你回答了自己的问题。 由于“全局解释器锁定”(GIL),Python存在问题。

首先在谷歌上搜索“python gil”: http : //www.grouplens.org/node/244

Interesting Posts