为什么Python在多处理或多线程应用程序方面不比Java更好?

2024-05-17 04:33:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 证明应用程序方式javagil理由
2条回答

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

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

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

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

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

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

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

我患有“速度怪胎”综合症,可能是因为我有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函数在内存中创建对象的副本,而不是修改它们(例如,请参见http://www.skymind.com/~ocrow/python_string/

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

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

我要说的是,我已经决定百分之百地使用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

相关问题 更多 >