iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python为什么这么慢
  • 229
分享到

Python为什么这么慢

2023-06-17 00:06:10 229人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容介绍了“python为什么这么慢”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python 现在越来越火,已经迅速扩张到包括 dev

本篇内容介绍了“python为什么这么慢”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Python 现在越来越火,已经迅速扩张到包括 devops、数据科学、WEB 开发、信息安全等各个领域当中。

然而,相比起 Python 扩张的速度,Python 代码的运行速度就显得有点逊色了。

在代码运行速度方面,Java、C、c++C# 和 Python 要如何进行比较呢?并没有一个放之四海而皆准的标准,因为具体结果很大程度上取决于运行的程序类型,而语言基准测试Computer Language Benchmarks Games可以作为衡量的一个方面。

根据我这些年来进行语言基准测试的经验来看,Python 比很多语言运行起来都要慢。无论是使用 JIT 编译器的 C#、Java,还是使用 AOT 编译器的 C、C++,又或者是 javascript 这些解释型语言,Python 都比它们运行得慢。

注意:对于文中的 “Python” ,一般指 CPython 这个官方的实现。当然我也会在本文中提到其它语言的 Python 实现。

我要回答的是这个问题:对于一个类似的程序,Python 要比其它语言慢 2 到 10 倍不等,这其中的原因是什么?又有没有改善的方法呢?

主流的说法有这些:

  • “是

    全局解释器Global Interpreter Lock

    (GIL)的原因”

  • “是因为 Python 是解释型语言而不是编译型语言”

  • “是因为 Python 是一种动态类型的语言”

哪一个才是是影响 Python 运行效率的主要原因呢?

是全局解释器锁的原因吗?

现在很多计算机都配备了具有多个核的 CPU  ,有时甚至还会有多个处理器。为了更充分利用它们的处理能力,操作系统定义了一个称为线程的低级结构。某一个进程(例如 Chrome  浏览器)可以建立多个线程,在系统内执行不同的操作。在这种情况下,CPU  密集型进程就可以跨核心分担负载了,这样的做法可以大大提高应用程序的运行效率。

例如在我写这篇文章时,我的 Chrome 浏览器打开了 44 个线程。需要提及的是,基于 POSIX 的操作系统(例如 Mac OS、linux)和 windows 操作系统的线程结构、api 都是不同的,因此操作系统还负责对各个线程的调度。

如果你还没有写过多线程执行的代码,你就需要了解一下线程锁的概念了。多线程进程比单线程进程更为复杂,是因为需要使用线程锁来确保同一个内存地址中的数据不会被多个线程同时访问或更改。

CPython 解释器在创建变量时,首先会分配内存,然后对该变量的引用进行计数,这称为引用计数reference counting。如果变量的引用数变为 0,这个变量就会从内存中释放掉。这就是在 for 循环代码块内创建临时变量不会增加内存消耗的原因。

而当多个线程内共享一个变量时,CPython 锁定引用计数的关键就在于使用了 GIL,它会谨慎地控制线程的执行情况,无论同时存在多少个线程,解释器每次只允许一个线程进行操作。

这会对 Python 程序的性能有什么影响?

如果你的程序只有单线程、单进程,代码的速度和性能不会受到全局解释器锁的影响。

但如果你通过在单进程中使用多线程实现并发,并且是 io 密集型(例如网络 IO 或磁盘 IO)的线程,GIL 竞争的效果就很明显了。

Python为什么这么慢

由 David Beazley 提供的 GIL 竞争情况图Http://dabeaz.blogspot.com/2010/01/python-gil-visualized.html

对于一个 web 应用(例如 Django),同时还使用了 WSGI,那么对这个 web 应用的每一个请求都运行一个单独的 Python 解释器,而且每个请求只有一个锁。同时因为 Python 解释器的启动比较慢,某些 WSGI 实现还具有“守护进程模式”,可以使 Python 进程一直就绪。

其它的 Python 解释器表现如何?

PyPy 也是一种带有 GIL 的解释器,但通常比 CPython 要快 3 倍以上。

Jython 则是一种没有 GIL 的解释器,这是因为 Jython 中的 Python 线程使用 Java 线程来实现,并且由 JVM 内存管理系统来进行管理。

JavaScript 在这方面又是怎样做的呢?

所有的 Javascript 引擎使用的都是 mark-and-sweep 垃圾收集算法,而 GIL 使用的则是 CPython 的内存管理算法。

JavaScript 没有 GIL,而且它是单线程的,也不需要用到 GIL, JavaScript 的事件循环和 Promise/Callback 模式实现了以异步编程的方式代替并发。在 Python 当中也有一个类似的 asyncio 事件循环。

是因为 Python 是解释型语言吗?

我经常会听到这个说法,但是这过于粗陋地简化了 Python 所实际做的工作了。其实当终端上执行 python myscript.py 之后,CPython 会对代码进行一系列的读取、语法分析、解析、编译、解释和执行的操作。

如果你对这一系列过程感兴趣,也可以阅读一下我之前的文章:在 6 分钟内修改 Python 语言 。

.pyc 文件的创建是这个过程的重点。在代码编译阶段,Python 3 会将字节码序列写入 __pycache__/ 下的文件中,而 Python 2 则会将字节码序列写入当前目录的 .pyc 文件中。对于你编写的脚本、导入的所有代码以及第三方模块都是如此。

因此,绝大多数情况下(除非你的代码是一次性的……),Python 都会解释字节码并本地执行。与 Java、C#.net 相比:

Java 代码会被编译为“中间语言”,由 Java 虚拟机读取字节码,并将其即时编译为机器码。.NET CIL 也是如此,.NET CLR(Common-Language-Runtime)将字节码即时编译为机器码。

既然 Python 像 Java 和 C# 那样都使用虚拟机或某种字节码,为什么 Python 在基准测试中仍然比 Java 和 C# 慢得多呢?首要原因是,.NET 和 Java 都是 JIT 编译的。

即时Just-in-time(JIT)编译需要一种中间语言,以便将代码拆分为多个块(或多个帧)。而提前ahead of time(AOT)编译器则需要确保 CPU 在任何交互发生之前理解每一行代码。

JIT 本身不会使执行速度加快,因为它执行的仍然是同样的字节码序列。但是 JIT 会允许在运行时进行优化。一个优秀的 JIT 优化器会分析出程序的哪些部分会被多次执行,这就是程序中的“热点”,然后优化器会将这些代码替换为更有效率的版本以实现优化。

这就意味着如果你的程序是多次重复相同的操作时,有可能会被优化器优化得更快。而且,Java 和 C# 是强类型语言,因此优化器对代码的判断可以更为准确。

PyPy 使用了明显快于 CPython 的 JIT。更详细的结果可以在这篇性能基准测试文章中看到:哪一个 Python 版本最快?。

那为什么 CPython 不使用 JIT 呢?

JIT 也不是***的,它的一个显著缺点就在于启动时间。 CPython 的启动时间已经相对比较慢,而 PyPy 比 CPython  启动还要慢 2 到 3 倍。Java 虚拟机启动速度也是出了名的慢。.NET CLR 则通过在系统启动时启动来优化体验,而 CLR  的开发者也是在 CLR 上开发该操作系统。

因此如果你有个长时间运行的单一 Python 进程,JIT 就比较有意义了,因为代码里有“热点”可以优化。

不过,CPython 是个通用的实现。设想如果使用 Python 开发命令行程序,但每次调用 CLI 时都必须等待 JIT 缓慢启动,这种体验就相当不好了。

CPython 试图用于各种使用情况。有可能实现将 JIT 插入到 CPython 中,但这个改进工作的进度基本处于停滞不前的状态。

如果你想充分发挥 JIT 的优势,请使用 PyPy。

是因为 Python 是一种动态类型的语言吗?

在 C、C++、Java、C#、Go 这些静态类型语言中,必须在声明变量时指定变量的类型。而在动态类型语言中,虽然也有类型的概念,但变量的类型是可改变的。

a = 1a = "foo"

在上面这个示例里,Python 将变量 a 一开始存储整数类型变量的内存空间释放了,并创建了一个新的存储字符串类型的内存空间,并且和原来的变量同名。

静态类型语言这样的设计并不是为了为难你,而是为了方便 CPU 运行而这样设计的。因为最终都需要将所有操作都对应为简单的二进制操作,因此必须将对象、类型这些高级的数据结构转换为低级数据结构。

Python 也实现了这样的转换,但用户看不到这些转换,也不需要关心这些转换。

不用必须声明类型并不是为了使 Python 运行慢,Python 的设计是让用户可以让各种东西变得动态:可以在运行时更改对象上的方法,也可以在运行时动态添加底层系统调用到值的声明上,几乎可以做到任何事。

但也正是这种设计使得 Python 的优化异常的难。

为了证明我的观点,我使用了一个 Mac OS 上的系统调用跟踪工具 DTrace。CPython 发布版本中没有内置 DTrace,因此必须重新对 CPython 进行编译。以下以 Python 3.6.6 为例:

wget https://GitHub.com/python/cpython/arcHive/v3.6.6.zipunzip v3.6.6.zipcd v3.6.6./configure --with-dtracemake

这样 python.exe 将使用 DTrace 追踪所有代码。Paul Ross 也作过关于 DTrace 的闪电演讲。你可以下载 Python 的 DTrace 启动文件来查看函数调用、执行时间、CPU 时间、系统调用,以及各种其它的内容。

sudo dtrace -s toolkit/<tracer>.d -c &lsquo;../cpython/python.exe script.py&rsquo;

py_callflow 追踪器显示了程序里调用的所有函数。

那么,Python 的动态类型会让它变慢吗?

  • 类型比较和类型转换消耗的资源是比较多的,每次读取、写入或引用变量时都会检查变量的类型

  • Python 的动态程度让它难以被优化,因此很多 Python 的替代品能够如此快都是为了提升速度而在灵活性方面作出了妥协

  • 而 Cython 结合了 C 的静态类型和 Python 来优化已知类型的代码,它可以将性能提升 84 倍

“Python为什么这么慢”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Python为什么这么慢

本文链接: https://www.lsjlt.com/news/286437.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python为什么这么慢
    本篇内容介绍了“Python为什么这么慢”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python 现在越来越火,已经迅速扩张到包括 Dev...
    99+
    2023-06-17
  • 浅谈Usingfilesort和Usingtemporary为什么这么慢
    目录1.简介2.Using filesort2.1 Using filesort 现象模拟2.2 Using filesort 之Mysql的执行过程2.2.1 全字段排序2.2.2...
    99+
    2024-04-02
  • React新特性为什么产出这么慢
    本篇内容主要讲解“React新特性为什么产出这么慢”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React新特性为什么产出这么慢”吧!有人曾说:每过一年,前端的...
    99+
    2024-04-02
  • Python为什么会这么火
    这篇文章给大家分享的是有关Python为什么会这么火的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  Python是一门非常不错的编程语言,也是非常具有发展前景的学科,学习之后可以从事多个岗位,薪资待遇也是非常不...
    99+
    2023-06-05
  • 为什么Python正在慢慢失去魅力
    本篇内容主要讲解“为什么Python正在慢慢失去魅力”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“为什么Python正在慢慢失去魅力”吧!是什么使Python如此流行Python迅猛发展的主要推...
    99+
    2023-06-16
  • github为什么慢
    随着国内软件行业的迅速发展,越来越多的开发者开始使用Github这个开源代码托管平台。然而,许多人都会遇到Github慢的问题,这不仅浪费了开发者的时间,也影响了项目的开发进度。那么Github为什么会慢呢?1.网络延迟问题Github是全...
    99+
    2023-10-22
  • JavaScript为什么这么难
    本篇内容主要讲解“JavaScript为什么这么难”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript为什么这么难”吧!难点隐式转换javascr...
    99+
    2024-04-02
  • Nginx 为什么这么快?
    来源:rrd.me/ggFBdNginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 N...
    99+
    2023-06-04
  • 云服务器速度比个人电脑快吗为什么这么慢
    另外,云服务器的使用也可以使得数据更加安全和可靠。因为云服务器可以提供高可用性和高安全性的服务,当用户的数据出现问题时,云服务器可以快速地为用户提供数据备份和恢复的服务,保证用户数据的安全性。 此外,云服务器的高可扩展性也可以为用户提供更...
    99+
    2023-10-27
    个人电脑 速度 服务器
  • 阿里云服务器等于1个空间吗为什么这么慢
    阿里云服务器是一种虚拟化服务器,通常包括多个服务器节点,每个节点都运行着相同的软件服务,这些服务包括数据库服务器、负载均衡器、CDN 等。 阿里云服务器的运行速度取决于多个因素,例如服务器硬件配置、网络带宽、存储空间、网络连接等。此外,阿...
    99+
    2023-10-27
    阿里 服务器 空间
  • 阿里云服务器等于1个空间吗为什么这么慢呢
    实际上,阿里云提供的空间大小与多种因素有关。首先,阿里云的主要服务是云计算,因此阿里云的空间大小受到了云计算服务商的影响。其次,阿里云的服务器也可能使用了不同的硬件配置,从而影响到阿里云的空间大小。此外,阿里云的网络带宽和服务器硬件配置也会...
    99+
    2023-10-28
    阿里 服务器 空间
  • 为什么https比http慢
    https比http慢的原因https与http都是建立在TCP协议上的,但不同的是,其中http使用三个握手数据包建立连接后,就可以直接传输数据内容;而https在使用三个握手数据包建立连接后,还需要一个SSL握手的步骤,且SSL握手阶段...
    99+
    2024-04-02
  • Python为什么这么厉害?我给大家解析
    请点击此处输入图片描述Python的特点之一在于,使用简单的语法,就能处理大量复杂问题。这使得初学者能够专注于学习编程概念,同时不必担心太多的细节,还可以节省大量时间。比如以编程中最常见的程序“ Hello ,World ”代码为例:Py...
    99+
    2023-01-31
    我给 厉害 Python
  • golang为什么可以这么快
    golang可以这么快的原因:1、并发编程模型,提供了一个轻量级的Goroutine机制,能以非常低的成本启动和管理成千上万个并发执行的Goroutine;2、垃圾回收机制,能自动检测和清理不再使用的内存,减轻开发人员的负担;3、高效的编译...
    99+
    2023-07-17
  • SAP ERP为什么这么复杂
    小编今天带大家了解SAP ERP为什么这么复杂,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“SAP ERP为什么这么复杂”的知识吧。...
    99+
    2023-06-05
  • ddos防护为什么这么贵
    ddos防护贵的原因:ddos防御提供商需要大量投入人力、技术、资源来实现DDoS流量清洗系统,而DDoS流量清洗系统由攻击检测、攻击缓解和监控管理三个部分构成,因此投入的成本比较高,自然ddos防御价格会贵点。...
    99+
    2024-04-02
  • Python为什么正在慢慢失去对码农的吸引力
    这篇文章主要介绍“Python为什么正在慢慢失去对码农的吸引力”,在日常操作中,相信很多人在Python为什么正在慢慢失去对码农的吸引力问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python为什么正在慢慢...
    99+
    2023-06-16
  • 为什么Kubernetes这么受欢迎
    这篇文章主要讲解了“为什么Kubernetes这么受欢迎”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么Kubernetes这么受欢迎”吧!以数据(YA...
    99+
    2024-04-02
  • Linux为什么这么多人用
    这篇文章主要为大家展示了“Linux为什么这么多人用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux为什么这么多人用”这篇文章吧。Linux过去主要作为服务器运行,但经过几年的发展,其用...
    99+
    2023-06-12
  • Kubernetes为什么这么受欢迎
    这篇文章主要介绍“Kubernetes为什么这么受欢迎”,在日常操作中,相信很多人在Kubernetes为什么这么受欢迎问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Kubernetes为什么这么受欢迎”的疑...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作