为什么Python在多处理或多线程应用程序中不如Java?

为什么Python在多处理或多线程应用程序中不如Java?,java,python,multithreading,multiprocessing,gil,Java,Python,Multithreading,Multiprocessing,Gil,由于Python在GIL方面存在一些问题,Java更适合于开发多处理应用程序。你能用你的方式证明java比python更有效的处理的确切原因吗?在CPython中,多线程的最大问题是(请注意,其他python实现不一定有这个问题!) GIL是一个实现细节,可以有效地防止Python中单独线程的并行(同时)执行。问题在于,无论何时执行Python字节码,当前线程必须获得GIL,并且在任何给定时刻只有一个线程可以拥有GIL 因此,如果5个线程试图执行一些Python字节码,那么它们将有效地运行交错,

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

在CPython中,多线程的最大问题是(请注意,其他python实现不一定有这个问题!)

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

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

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


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

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

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

我患有“速度怪胎”综合症,可能是因为我有C/ASM的背景,所以我花了相当长的时间来弄清“Python慢吗?”

简单的答案是什么?“可以。”这里有一些要点:

1) 对于多线程应用程序,Python将比任何没有类似于GIL的语言都有缺点。GIL是CPython中Python虚拟机的产物,而不是Python语言本身。一些Python虚拟机,如Jython、IronPython等没有GIL

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

3) 不管GIL如何,Java在许多方面都比Python显示出更快的代码执行速度。这是因为Python处理内存中对象的方式存在本机差异:

  • 许多Python函数在内存中创建对象的副本,而不是修改它们(参见示例)

  • Python使用Dict来存储对象的属性,等等。我不想分散注意力,深入研究这些领域,但我可以说Python可以做的一些“整洁”的事情是以速度为代价的。同样重要的是要知道,如果默认行为对你造成了太高的速度惩罚,有一些方法可以避免

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

  • 查看有关其中一些问题的更多讨论
我要说的是,我已经决定在开发新代码时几乎100%地采用Python

不要落入过早优化的陷阱,记住,在必要的时候,您可以随时调用C代码。使您的代码工作良好,使其可维护,然后在应用程序的速度不能满足您的需要时开始优化

有趣的基准:

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


不带锁的Python实现将需要不同的内存处理行为(GC而不是引用计数,从而导致不确定的清理)。多线程环境中的引用计数有点难以有效完成。Jython似乎没有GIL-看,你知道GIL是什么吗?这个问题是错误的。在多处理应用程序中,GIL不会成为一个问题,因为多处理Python应用程序将愉快地在多个内核中并发运行。Java做多处理并不比python好。另一方面,多线程。。。