📜  详细分析动态类型和并发对Python?

📅  最后修改于: 2021-10-22 02:46:13             🧑  作者: Mango

Python是不是太慢了?实际情况是, Python是一种非常慢的编程语言,当我们查看Java、C 和 C++ 之类的东西时,令人尴尬的是它们做事情的速度比Python快多少,事实上,特定的算法和应用程序实际上可以做大约一百到一百件事情。比原生Python语言快 200 倍,所以在本文中,我们将讨论为什么会这样,以及我们作为Python程序员可以使用的不同技术来加速和运行更多并发Python应用程序,现在就在我们走得太远之前值得注意的是,虽然Python缺乏速度,但它弥补了开发和开发程序的速度,使用Python开发程序更快、更简单并且最终成本更低,因为现在项目涉及的劳动力更少,这在许多情况下是一个巨大的优势,您可以实际编写Python中的Java等效代码比使用该语言执行的速度快四到五倍,所以这是需要考虑的吗?

为什么Python很慢?

这种语言(Python)慢的主要原因不是全局解释器锁,尽管这是我们编写更快Python程序的速度和方式的一个因素,而这并不是该语言慢的根本原因。 Python速度慢的原因是它是动态类型的,现在我们将更详细地讨论这一点,但我们想与Java 之类的语言进行比较。现在,在Java,所有内容都是静态类型的,并且这种语言在运行之前进行编译,这与Python在运行时通过解释器进行编译不同。现在在Java发生的事情是,当您编写代码时,您需要定义每个变量的类型,您的方法和函数将返回的类型,并且您几乎必须准确定义一切将是什么在整个代码中。现在虽然这会导致更长的开发时间并且需要更长的时间来编写代码,但它的作用是提高编译时的效率,现在它实际工作的原因以及它比Python代码运行得更快的原因是因为如果您知道特定变量或对象的类型,则可以执行大量不同的优化,并避免在实际运行代码时执行大量不同的检查,因为这些检查是在Java编译时执行的本质上,你不能编译任何没有实际的Java代码,或者甚至只是像类型错误一样,而你在编写代码时将尝试编译它,它会说这种类型不准确,你可以’如果不这样做,您将无法编译它,因为它知道在运行时将无法正常工作,因此基本上所有这些在代码运行时实际需要在Python执行的检查都是事先执行的,并且有由于这种静态类型的长度,只进行了大量优化。现在人们可能会问这样的问题,为什么Python不这样做?对此的答案是Python是动态类型的,这仅意味着任何变量都可以在程序运行时更改其类型并可以在程序中的任何点更改其值,这意味着我们实际上无法事先编译整个程序,因为我们可以不要一次进行所有这些检查,因为我们不知道这些变量将是什么类型,它们会在运行时发生变化,会发生不同的事情,因此我们无法获得所有这些优化我们可能使用Java、C 或 C++ 等较低级别的语言,这就是该语言速度慢的根本原因,这种动态类型和任何快速语言都将有一个编译器可以运行,它将使确保一切都很好,它会在运行时实际运行代码之前进行所有这些检查,而Python发生的事情是所有代码在运行时实际编译和检查,而不是之前编译和 ta在您运行代码之前的所有时间里,会进行许多检查以确保该对象是正确的,这些类型是正确的,一切都一样。

接下来要讨论的是Python缺乏并发性。这将是影响速度的主要因素,如果您使用Java、C 编写应用程序,您可以将所有内容分散到多个线程中,这样您就可以利用 CPU 的所有内核,从而将其分解为现代计算我们大多数人都有四个核心 CPU 或更高,这允许我们同时运行四个任务,现在使用Python这是不可能的。 Python说,对于每个解释器,我们一次最多可以运行一个线程,而线程只是 CPU 内核上发生的某种操作,这意味着即使我们在Python程序中创建了许多线程,我们也只能在Java程序或 C 程序中使用一个 CPU 核心可能会使用全部八个或全部四个,这将导致速度提高 4 倍或 8 倍,现在我们可以通过使用多处理在Python解决这个问题但是有一些问题。

为什么全局解释器锁存在于Python,为什么这是该语言的一个特性?

嗯,答案很简单,这可以追溯到Python的动态类型,因此在Python管理内存的方式现在不是线程安全的,即,如果两个线程试图同时访问内存中的一个特定对象到时候你会看到一些问题,本质上我们不能允许这种情况发生,所以Python所做的是拥有一个全局解释器锁,这意味着一次只能运行一个线程来防止这种情况发生,因为我们知道主要多处理和多线程应用程序的问题在于您必须处理锁定和共享内存。

我们如何加速我们的Python代码?

一种方法是使用 C 代码作为我们Python库的扩展。现在Python建立在 C 之上,这就是为什么Python的排序算法比您在Python编写本机排序运行得更快的原因。因此,如果您需要创建一些可以在Python快速运行的东西并且您不能使用不同的语言,我们可以用 C 编写该算法并将其作为扩展导入到您的Python代码中,这样您就可以更快地运行该代码如果你只是用Python本地编写它。

结论

  • Python之所以慢,主要是因为该语言的构建方式,即,由于Python涉及的动态类型,我们无法在编译和解释中引入很多优化,而我们在其他语言(如Java具有这些优化。
  • 为了提高Python代码的速度,您可以使用某种线程和并发,您可以使用 multiprocessing 模块,该模块将允许您同时运行多个解释器并通过全局解释器锁定,但您可能会遇到共享的一些问题和锁定内存。
  • 另一种加速Python代码的方法是,您可以为Python代码编写一些自己的 C 扩展。