当前位置: 首页 > news >正文

网站开发的推荐参考书网站开发技术简介

网站开发的推荐参考书,网站开发技术简介,网站建设源代码上传,手机网站开发用什么原文:https://hackernoon.com/why-is-python-so-slow-e5074b6fe55b​hackernoon.comPython 正在爆炸般流行起来#xff0c;它被用于DevOps, 数据处理#xff0c;web开发和安全领域。但是在速度方面却没有取得过什么胜利。 Java在速度方面和C/C/C#/Python比起来如何#xff…原文:https://hackernoon.com/why-is-python-so-slow-e5074b6fe55b​hackernoon.comPython 正在爆炸般流行起来它被用于DevOps, 数据处理web开发和安全领域。但是在速度方面却没有取得过什么胜利。 Java在速度方面和C/C/C#/Python比起来如何答案很大程度上取决于你所运行的应用。没有什么跑分是完美的但是编程语言测评游戏(Computer Language Benchmarks Game)是一个很好的切入点。 十多年来编程语言测评游戏一直对我来说是一个参考相比于其他语言比如Java, C#, Go, JavaScript, C, Python是最慢的语言之一。这些语言中包含了JIT编译器(c#, java)AOT编译器(c/c)和解释型语言js。注意: 当我说“Python”, 我说的是Python的参考实现CPython, 其他实现这篇文章也会提到。 这篇文章想要回答的一个问题就是当Python执行一个相同的程序要比别的语言实现慢2-10倍的时候为什么会这么慢难道我们不能让它跑的更快吗下面说一下本文的主要观点(当然也是客观事实): 因为Python 有GIL(Global Interpreter Lock, 全局解释锁) “因为Python 是解释型语言而不是编译型” “因为Python 是动态类型语言” 哪一个原因影响最大对速度影响最大呢GIL现代计算机的cpu有多核有时候有多个处理器。为了充分利用多出来的处理能力操作系统定义了一种更加低级别的单位:线程让一个进程可以启动多个线程来执行系统指令。 这样的话如果一个进程的CPU资源非常紧张负载就会均匀的平摊到各个CPU核心这种方法能够很高效地让大多数任务更快完成。 当我写这篇文章的时候我的Chrome浏览器开启了44个线程。要记住的是线程的结构和api在POSIX-based的系统(OSX, Linux)和Windows下面是不一样的。操作系统同样会管理线程的调度。 如果你没有进行过多线程编程你需要快速熟悉一下锁的概念。不像单线程的进程多线程的进程中当你更改内存中的变量你需要确认多个线程不会同时尝试访问或修改同一个内存块。当CPython创建变量它会给变量分配内存空间并且计算变量的引用数如果引用数为0, Python将会释放掉这块内存这就是为什么for循环表达式里的临时变量不会让内存爆炸。也是CPython的垃圾回收机制。接下来的挑战是当变量被多个线程共享时如何锁住引用数。Python程序执行过程中有一个全局解释锁GIL 小心地控制着线程的执行。Python解释器在同一时间只能执行一个操作不论有多少个线程。这对于Python应用的性能表现意味着什么呢如果你的应用是单线程单解释器的这对你的应用性能毫无影响。移除GIL也不会对你的应用性能有任何影响。 如果你想在同一个解释器中使用线程进行并发操作并且你的线程是IO密集型的那你就会看到GIL的资源争夺。David Beazley的博客中对多线程程序中 GIL 的作用进行了可视化:http://dabeaz.blogspot.com/2010/01/python-gil-visualized.html下图表示了Python多线程程序中GIL的分配情况。如果一个Python程序里有多个线程一个程序运行的时候会拿着GIL当遇到I/O的时候会放开GIL但是CPU-bound的线程通常不会进行I/O。Python切换线程的一种作法是每100 ticks检查一下可以通过sys.setcheckinterval()修改这个数值。 综上所述因为Python线程不能有效利用多核但是增加了CPU context switch的消耗所以对于CPU-bound的程序表现很差。更糟糕的是在多核情况下可能表现会更差因为系统支持多线程运行但是GIL保证只有一个线程运行这时候多线程会反复的检查GIL是否被释放但是拿不到GIL(因为有太多线程竞争)有可能导致系统发生Trashing现象。如果你使用一个web应用(Django)并且使用WSGI每个请求会有一个单独的Python解释器由于Python的全局解释锁启动很慢所以有的WSGI实现会有一个“守护模式”就是先把Python进程启动起来放着等待请求进来使用。那其他的Python实现呢PyPy也有GIL但是比CPython快超过三倍。 JPython 没有GIL, 因为JPython的线程代表一个Java线程得益于JVM的内存管理机制JPython不使用GIL。JavaScript是怎么做的呢首先所有的Javascript 引擎使用标记-清除的垃圾回收机制。 上面提到过 GIL的需求主要是因为CPython的内存管理算法。 JavaScript 没有GIL, 但它同时也是单线程的所以它并不需要GIL。JavaScript使用事件循环和Promise/Callback实现异步的编程而不是使用并发。Python也有类似实现asyncio“因为Python是解释型语言”我经常听说这个言论我觉得这是一个对于CPython执行方式的粗暴简化。 如果你在终端执行一个命令(比如python myscript.py)CPython会开始顺序执行一大串任务: 读取词法分析解析编译解释执行代码。一个重点是.pyc文件的创建。在编译阶段字节码串被写到pycache/下(3.x)或者和py文件相同的文件夹(2.x)。这个操作不仅对你自己的代码有效也包括所有你导入的模块。所以大多数情况下Python在本地解释和执行字节码与之相比 Java 和 C#.NET: Java 编译成一个“中间语言”然后JVM读字节码实时将其转化为机器码.NET的CIL也一样.NET CLR(Common-Language-Runtime, 通用语言运行时)使用的是实时编译到机器码(JIT)。所以如果它们都用到了虚拟机和部分字节码为什么Python在跑分上比Java/C#慢这么多呢? Java/C# 是即时编译(JIT)的。 JIT要求一个中间语言以便让代码转换成区块。AOT编译是为了可以在交互前保证CPU能理解每一行代码。 JIT本身不会让执行速度更快以为它仍然是在执行相同的字节码 然而JIT可以让实时优化成为可能一个好的JIT编译器应用的那一部分被执行很多次这些部分被称为“热点”。 这样编译器会将这些部分替换成更加高效的版本。这意味着如果你的程序重复做相同的事情使用JIT就能显著提高速度。同时Java/C#是强类型的语言所以优化器可以对语言作出更多预设。PyPy 使用JIT前面提到它比CPython快得多。所以为什么CPython不用JIT呢JIT有很多缺点其中一个就是启动慢。CPython 启动已经相对很慢了, PyPy比CPython启动慢CPython2-3倍。JVM启动是出了名的慢。.NET CLR使用随操作系统启动来解决这个问题, 但CLR的开发者同时也是其依赖的系统的开发者(win)。如果你的Python是单进程运行时间很长并且有很多重复操作可以被优化那么使用JIT就很有意义。 但是CPython是通用实现当使用Python开发命令行工具每次都等待JIT启动是非常糟糕的体验。 CPython需要服务于尽可能广泛的场景有可能使用JIT反而会大幅度拖累系统性能。 如果你需要使用JIT并且有一个适合的工作场景那可以使用PyPy。“因为Python是动态类型语言”在静态类型语言中声明变量之前需要声明变量类型包括 C, C, Java, C#, Go。动态类型语言中仍然有类型的概念但是变量的类型可变。a 这个小例子中, Python 使用相同的变量名创建了类型不同的第二个变量释放掉了第一个变量的内存空间。 静态类型语言并不是为了麻烦你而设计的而是根据CPU行为设计的。如果所有的行为最终会变成二进制操作你必须将对象转换成更加底层的数据结构。Python为你代劳了转换到底层数据结构这一步所以你不用关心。当然不用声明变量并不是Python慢的原因。 Python语言的设计极为灵活几乎所有东西都能变成动态的比如猴子补丁。这种设计让Python的优化变得难以想象的困难。猴子补丁: 1. 在运行时替换方法、属性等 2. 在不修改第三方代码的情况下增加原来不支持的功能 3. 在运行时为内存中的对象增加patch而不是在磁盘的源代码中增加python中一个很简单的例子import 所以是Python的动态性让它如此慢吗比较和转换类型非常耗费资源, 每次对变量读写、引用都需要检查类型。如此动态化的语言是很难优化的很多Python的不同实现能更快是因为为了性能在灵活性方面做了妥协。比如CPython, 将C语言的静态类型和Python结合这些静态类型能提供84倍的性能优化。结论Python这么慢主要是因为动态的生态和它的多功能性。它能用来解决所有类型的问题所以在不同领域我们可以选择更加快速的Python版本。 有很多方法可以用来优化你的Python程序比如活用async, 了解分析工具, 考虑使用多个解释器等等。比如一些启动时间不重要的应用或者能够能JIT获益的程序我们可以使用PyPy。如果你的代码有些部分非常要求性能又使用了很多C语言的静态类型那么选择Cython。
http://www.zqtcl.cn/news/458616/

相关文章:

  • 做网站还有用PHP网站开发如何建立vip
  • 东莞广告公司东莞网站建设辽宁城乡建设部网站
  • 公司网站开发详细流程php网站开发优点
  • 广东网站建设多少钱比较大气的网站
  • asp.net怎么做登录网站网站建设服务网络服务
  • 网站备案级别做公司网站要多少钱
  • 湛江网站seo网站定制排名
  • 为什么网站之有首页被收录企业网站发布图片文章
  • 做网站要准备内蒙做网站
  • 邯郸市搞网站服务务的吗网站建设怎么在图片上加字
  • 卡片风格网站我想做跑腿网站怎么做
  • 公司网站建设前期情况说明如何找厂家地址
  • 超值的郑州网站建设wordpress 移除 新闻
  • 长春网络营销网站徐州手机模板建站
  • 微网站开发+在线商城建设局招标网站
  • 网站开发的基本过程关岭做网站
  • 高端网站哪种好WordPress媒体库丢失
  • 澄迈网站新闻建设宣传视频
  • 南昌优化网站排名公司建设网站的步骤
  • 一个人做网站wordpress如何加链接
  • 查网站服务器所在地笔记本电脑安装wordpress
  • 石家庄网站推广专家php网站分类目录源码
  • 盐城市城乡建设局门户网站低代码开发软件
  • 网站建设中的html深圳建设网站需要多少钱
  • 南阳公司网站制作品牌推广工作内容
  • 网站被刷流量怎么办红色php企业网站模板下载
  • 做现货黄金的金融网站设计平台app
  • 淘宝客手机网站搭建网站设计专业公司
  • 做网站用的图片怎样压缩钓鱼网站的制作教程
  • 建设网站类型wordpress竖版图片尺寸