001.python前言
❝
本系列文章是我个人学习《python学习手册(第五版)》的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展。
非商业用途转载请注明作者和出处;商业用途请联系本人(gaoyang1019@hotmail.com)获取许可。
❞
关于python优缺点的分析
python可读性高,移植性较好 代码简洁,完成同样的问题相比java和C++,代码量是其的1/5~1/3 效率相对C语言叫差,但也不是那么差 开源,社区活跃度很高,官方和民间提供了很多的库可以直接使用
❝
这里引申出一个问题,关于开源的优缺点。以下内容为个人理解,仅代表我的个人观点,不具备权威性
开源的优点
1)源代码开放,相对比较安全;
2)开源软件大部分可以免费使用,即使需要付费许可,其许可费用相对也比较低。
3)开源软件的社区一般比较活跃,软件更新迭代速度很快。
关于开源软件的缺点
1)开源软件一般由相应的社区维护,其迭代速度取决于社区的活跃度。而且有可能因为开发人员的兴趣转移或者其他因素导致软件停止维护,存在一定的风险
2)开源软件的使用门槛相对来说比较高,虽然节省了开发成本,但是对部署和维护人员来说,要求一定的技术能力。比如,如果使用商业软件,后期的支持等工作可以由软件提供商负责,而开源软件并不存在响应的责任部门,所以部署维护全要靠自己的技术人员完成。这也就是为啥虽然开源软件许可费用很低甚至免费,很多公司机构依旧会选用商业软件的原因。毕竟能用钱解决的问题,对于有钱人来说都不是问题。
3)开源软件缺乏主导的控制,开源社区是一个*度相对较高的社区。缺乏绝对的主导。这就会因为开源社区过于活跃,导致版本分支的混乱。
❞
python运行过程
python是个解释型语言。这句话说的对,但不完全对。
首先简单说明下解释型语言和编译型语言:
「编译型语言:「源代码被」编译器」经过一连串的处理最终生成的是和处理器指令集强相关的,可以被处理器直接执行的二进制文件。 典型的C语言和C++。以常用的GCC编译器为例,从代码编程可执行的二进制文件要经过预编译->编译->汇编->链接等多个步骤。 优点:编译型语言从源码到可执行二进制文件时在运行前就已经完成的。所以在执行的时候不需要再次处理源码,效率较高 缺点:同样的,因为源码在执行前已经被处理成为处理器强相关的二进制文件,所以移植性很差。
「解释型语言:「源代码由」解释器」在「运行时」逐句翻译成机器码。 java,python等语言都属于这一类。但是又不严格的属于这一类。因为现在所谓的解释型语言都有所谓的优化,实际解释器在翻译的并不是源码,而是经过预处理的“半成品” 优点:由解释器执行翻译,平台不相关,移植性好。 缺点: 效率低 因为平台和源码之间还有个解释器,所以在部署的时候,需要先安装相关的运行环境比如java的jre等。当然也可以打包成对应的二进制文件,像py2exe这样的工具,但是它也是将python解释器和源码(字节码)同时打包了而已。
「python的运行过程」
源码(.py)先被解释器处理成字节码(.pyc) 程序运行时,字节码(.pyc)被解释器解释成可执行的指令
关于程序执行这一块暂时不讲,在后续的“有生之年系列”可能会有相关文章讲述这一块。
这里简答说一下字节码.pyc文件的生成。首先,字节码是一种平台无关的,低级的表现形式,主要用来提高运行速度。
如果python解释器具有写入的权限,在python3.2之前,字节码文件会被保存在源码目录下的子目录__pycache__
中,且解释器版本信息会保存在对应的.pyc文件内。在python3.2之后,字节码文件依旧会保存在该目录下,但是版本信息会保存在文件名中,如下图所示:
如果python解释器不具备写入权限,同样会生成字节码文件,但是该文件会保存在内存中.
「何时重新编译」
如果源码没有修改的话,在再次执行该代码的时候,python解释器会直接解释对应的字节码文件而不需重新"编译"(注意,这个编译是打了引号的.)字节码.那么何时重新"编译"字节码呢?两种情况:
「源文件改变:」 python解释器会检查源文件和字节码文件的最后修改的时间戳,如果时间不一致,则重新"编译"字节码 「解释器版本改变:」 如果字节码文件所使用的的解释器版本和当前执行代码所使用的解释器版本不一致,则重新"编译"
python的解释器
python的解释器有很多实现,这里介绍一下比较出名的几个.了解一下就好,毕竟用的最多的还是标准的CPython.
「CPython:」 由ANSI C语言实现,是标准的Python解释器. 我们在python官网下载的python套件中使用的就是CPython 运行速度最快,最完成,最新,最健全
「Jython:」 这玩意儿的目的是将Python和Java集成,将Python源码翻译成Java的字节码以便于使其运行在JVM上. 「IronPython:」 和Jython差不多,但是这家伙的目的是使python运行在.net框架之下. 「Stackless:」 CPython针对并发的优化,引入了协程的概念 「PyPy:」 采用JIT(just in time)技术,据说可以比python甚至C语言更快,在算法密集和计算密集的场景下性能更为突出.(这块不懂,不敢瞎白话)
本文使用 mdnice 排版