Python当前人气暴涨。它在DevOps,数据科学,Web开发和安全领域均有使用。

但是在速度方面没有赢得美誉。

这里有关于Python比较其他语言如,Java, C#, Go, JavaScript, C++进行性能对比,其中Python是最慢的。包含了JIT(C#, Java)和AOT(C,C++)编译器,也有像解释型语言如JavaScript。

注意:文章中我所提到的"Python"均指使用C语言实现的CPython。

为什么要比其他语言慢到2-10x的速度?

这是相关原因:它的GIL(Global Interpreter Lock)

因为是解释器型非编译型

因为是动态语言

那这些原因中哪个占最大成分呢?

它的GIL

现代计算机大多数都具备多核,有时还有多处理器。为了充分利用这些处理能力,操作系统底层提供了一个叫做线程的东西,它(例如Chrome浏览器)可以系统内容创建多个线程进行指令处理。也就是说当一个进程是CPU密集型,那就可以通过多个核协同工作来提高应用的运行速度。

我本地Chrome浏览器当前会开启44个线程,在不同的操作系统例如POSIX(Mac OS和Linux)和Windows提供的线程API结构不一样。操作系统来负责线程的调度。

如果你之前并没有进行过多线程编程,你需要熟悉一个叫做锁的概念。不像单线程进行,你需要确保在内存改变一个变量时,多个线程不会同时进行操作。

CPython创建变量时,它会开辟内存,然后计算有多少引用该变量,这个概念叫做引用计数。如果引用技术为0时,它会将内存释放回给系统。这也就是创建临时变量,进行循环操作时并不会耗光内存

在多线程共享变量时,CPython时如何对引用计数上锁呢。这里就是“全局解释锁(global interpreter lock)”负责做的事情,不管你有多少的线程,解释器在同一个时间只能有一个线程进行操作。

那么它对Python应用有什么性能影响

如果应用是单解释器,单线程。在速度上没有任何影响。

如果你想在单解释器使用线程了实现并发操作,并且它们是IO密集型(例如网络IO或者硬盘IO),那你将会看到GIL类似如下竞争执行:

如你有一个web应用(例如Django)并且使用WSGI,每个请求将会分配到单独Python解释器,此时一个请求只有一把锁。因为Python解释器启动比较慢,一些WSGI会实现为"Daemon Mode"执行,

那其他Python运行时呢

PyPy实现的GIL通常要比CPython快3x倍。

Jython没有GIL,因为Jython的线程受益与JVM的内存管理机制。

JavaScript 是怎么实现的

首先,JavaScript使用的是标记清除算法实现的垃圾回收机制。而CPython需要GIL主要原因就是内存管理算法。

JavaScript没有GIL,但是因为它设计的就是单线程,所以它并不需要。JavaScript的event loop和Promise/Callback机制来进行异步编码实现并发。Python也有类似的asyncio的event-loop机制。

因为它是解释型语言

如果你在终端使用python myscript.py运行,CPython将会进行一系列的读取,词法分析,语法分析,编译,解释和执行代码。

一个非常重要点事,在编译过程中生成的.pyc文件,Python3是放置在__pycache__目录下,Python2是在文件相同目录下。该文件就是Python里面的字节码,在执行文件不会生成,只会在倒入的模块或者第三方模块生成。

所以,Python解释成字节码并且进行运行。与Java和C#.NET相比:

Java 编译成一个中间语言,然后JVM加载字节码,进行just in time编译成机器码。.NET CLI也是同样的方式,.NET common language runtime使用just in time编译成机器码

那么,Python为什么要比Java和C#测试性能差那么多,都是使用字节码,区别就在于JIT编译方式。

Just in time需要一个中间语言允许代码被拆为多个chunks(或者frames),AOT编译器设计用来确保CPU能够理解里面的内容。

JIT本身没有提高代码执行,但是因为它执行仍然是字节码。然后,JIT允许在运行中优化执行。一个好的JIT加应用程序执行很高的代码,将字节码直接优化为机器码,从而提高执行效率,这种技术成为 Hot Spot。

也就是说在程序一次次执行过程中,会变得越来越快。还有就是,Java和C#是强类型语言,所以优化器能够进一步优化。

PyPy也有JIT,设计比CPython执行更快。

那么CPython为什么不用JIT

JIT也有缺点,就是减慢了启动时间。CPython启动时间已经很慢了,PyPy更是比CPython慢2-3x倍。JVM启动速度是臭的不行。.NET CLR在系统启动的时候就先启动了。

如果你有一个Python进程要长时间运行,那么可以使用JIT的hot spots带来的益处。

然而,CPython设计为通用语言。所以,当你在实现命令行应用时,每次都要长时间等待JIT启动那是非常讨厌的事情。

CPython也做很多尝试,也尝试性使用Plugging方式加入JIT,但是项目现在是停滞的。

因为它是动态类型的

在静态类型语言中,你必须在申明时就定义它的类型,这些语言有C,C++,Java,C#和Go。

在一个动态类型元中,虽然也有类型的概念,但是一个变量的类型是动态的a = 1a = "foo"

在上面示例中,Python使用了相同的变量赋于了不同的str类型,它会释放第一次创建的内存。

静态语言并不是设计来让你编码头疼,而是为了适应CPU的操作方式。因为所有的操作都是二进制操作,你需要将所有的对象和类型转换为低级别的数据结构。

Python已经为了做了这件事情,你看不见也不需要关系。

不用申明类型并不是导致Python变慢的直接原因,这样设计让你几乎所有操作都是动态的。你可以在运行时替换对象的方法,你可以在运行时对底层系统调用进行monkey-patch操作,一切皆有可能。

这样的设计导致Python很难进行优化。

为了验证我的观点,我将在我的Ubuntu系统中使用syscall追踪工具Dtrace。CPython并不内建DTrace,所以你需要重新编译CPython,我将使用Python 3.7.0:./configure --with-dtrace

make

现在代码中就可以使用Dtrace进行追踪了,你可以下载工具来对Python的函数调用,执行时间,CPU时间,syscalls等进行分析:sudo dtrace -s toolkit/.d -c "../cpython/python.exe script.py’

py_callflow追踪器打印了类似如下信息:

所以,Python动态类型是否让它变慢呢对比和转换类型代价很高,每次变量读取,类型检查时都很耗时。

动态类型很难对语言进行优化。Python其他替代方案要快,是因为它们为达性能对灵活性做出了妥协。

看看Cython,将C静态类和和Python优化类型可以在84x性能提高。

结论

Python主要慢的原因是因为它的动态和灵活性。它可以作为解决大多数问题的工具,也存在更优更快的可选方案。

可以在应用程序中利用async,理解性能工具,考虑使用多解释器等进行优化。

如果对于启动时间不是那么关心的话可以考虑使用JIT,例如PyPy。

对于性能要求比较苛刻的,你可以使用更多的静态类型变量,考虑使用Cython

python那么慢为什么还有人用-为什么Python如此慢相关推荐

  1. python那么慢为什么还有人用-为什么Python运算慢还拿来搞AI?这三点大多数都不知道?...

    首先慢是相对的.之前大家对python慢的理解,其实是因为那时候的机器资源有限,相对于c/c++这样可以直接操作内存的语言,python需要占用更多的内存,因此会慢.但是现在机器硬件成本已经可以忽略的 ...

  2. python那么慢为什么还有人用-为什么Python比C++慢很多?

    话说为什么大家会集中讨论GIL?在这里题主的标准线是一个按bit处理的单线程DFS啊--几乎没有GIL发挥的余地好么-- 这个八皇后的DFS,我的C++代码在不加某些评估性剪枝的情况下对15需要算18 ...

  3. python学什么版本2020年_2020年了居然还有人在学Python?学python有什么用?

    都2020年了居然还有人在学python?学python有什么用? 真是气抖冷啊! 想学习python的小伙伴,可以加裙595227871 领取免费的学习资料 为什么选择python? 1.行业人才的 ...

  4. fortran语言和python语言_fortran语言还有人用吗

    fortran语言还有人用吗? Fortran还是有人用的,不过一般是科学计算方面用得多一些. 它是世界上最早出现的计算机高级程序设计语言,广泛复应用于科学和工程计算领域.毕竟一个语言的存在自然有它的 ...

  5. python那么慢为什么还有人用-Python执行效率慢,为什么还这么火?【黑马程序员】...

    稍微了解python的同学,都知道python比起java这类编译型语言来说执行效率比较低,可是为什么python依然这么火呢? Python是一门解释型的动态语言,由于语言的解释执行的过程和动态类型 ...

  6. python那么慢为什么还有人用-为什么大家都说python编程的效率速度慢呢?

    今天的python培训想和大家分享一下python编程语言慢的原因,让大家采取一些措施避免其缺陷,希望对大家有所帮助! 近年来Python语言开始流行.它广泛应用于网络开发和运营.数据科学.网络开发和 ...

  7. python学到什么程度可以找到工作-Python学到什么程度可以面试工作?

    0710更新: 不多说,上干货!!!最近得到了一张比较全面的Python图谱,直接分享给你们!!!(我看过,知识点还是很全面的,基础知识.数据分析.爬虫实战.后台开发实战以及人工智能实战项目,都包含了 ...

  8. 杭州python就业情况_杭州Python就业前景如何 企业常问的Python面试题有哪些

    人工智能时代的来临带动了Python的火爆,企业对Python人才需求迫切,选择学习Python的Python的人与日俱增.有人好奇杭州Python就业前景如何,有人想知道企业常问的Python面试题 ...

  9. 【python热搜爬虫+定时发送邮件操作①】不会吧不会吧!不会2020了还有人需要用软件看微博热搜吧?

    以下内容为本人原创,欢迎大家观看学习,禁止用于商业用途,转载请说明出处,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/art ...

最新文章

  1. JS实现网易云轮播效果图
  2. 【体验】感谢朋友雪中送炭寄来的便携示波器,便携示波器开箱体验
  3. 理解离散傅立叶变换(三.复数)
  4. TLS回调函数(2)
  5. StringWriter/PrintWriter在Java输出异常信息中的作用
  6. java日期格式大全 format SimpleDateFormat
  7. java socket 通信协议_java网络通信(基于TCP协议可靠通信的socket编程)
  8. 1261:【例9.5】城市交通路网 《信息学奥赛一本通:动态规划基础》
  9. Redis 6.0 新特性概览
  10. python建立ip代理池_如何建Python爬虫的IP代理池?3步学会搭建IP代理池
  11. 超市登录系统 java_超市订单管理系统,登录功能实现
  12. 谷歌ai人工智能叫什么_Google I / O 2017的“ AI First”口号
  13. 从苏宁电器到卡巴斯基(后传)第04篇:还愿吾爱破解视频教程大赛
  14. 为ramda添加类型
  15. png在线转换透明ICO
  16. python爬虫之Scrapy CrawlSpider说明——以阳光平台为例
  17. 基于Java毕业设计校园外卖零食商城系统源码+系统+mysql+lw文档+部署软件
  18. Python为何能上位碾压Java?
  19. 如何看懂Elastic解决方案与Gartner的魔力象限
  20. 不忘初心 牢记使命 拉卡拉支付积极履行社会责任

热门文章

  1. SQL Server(第二章) 字符串函数、日期时间函数、转换函数
  2. 用Docker创建Nexus
  3. C++TSL之map容器(悲伤的故事)
  4. 《编写高质量代码:改善Java程序的151个建议》笔记
  5. 项目上线与LOG记录
  6. 什么是脏读,不可重复读,幻读
  7. 封装自己的控件库:iPhone静态库的应用
  8. java连接服务器读取日志
  9. hashlib 和loggin模块
  10. ubuntu下wps无法使用搜狗输入法输入中文