首页 > 编程知识 正文

python rpc框架对比,python基础面试题

时间:2023-05-05 20:08:38 阅读:22605 作者:1424

文章目录1 )高级编程语言类型1.1编译型语言1.2解释型语言1.3编译型语言VS解释型语言2 )什么是Python解释器*解释器? 2.1配置python解释器2.2 python代码执行过程2.2 python解释器类型CPythonJythonIronPython其他:3)什么是pyc文件3.1pyc文件? 为什么需要pyc? 什么时候生成pyc? 3.2生成pyc文件代码编译生成: Python Shell命令生成:使用3.3 pyc文件

Python是解释器类型的编程语言,因此解释型语言的运行机制

我们普通人不需要知道Python的工作原理。 但是,在了解其加速程序运行以及优化代码的设计思想,对于我们在日后构造缓存系统、如何减少不必要的运行时间,以及同步更新工作内容等问题中有很大的参考价值。

1 )高级编程语言类型为计算机程序,其实就是一组计算机指令集,能真正驱动机器运行的是机器指令,但直接让普通开发者编写机器指令是不现实的,因此出现了计算机高级语言。

在高级语言方面,但高级语言的程序最终必须被翻译成机器指令来执行高级编程语言可分为程序的执行方式编译型和解释型两种。

1.1编译型语言现有的c、c、Objective-C、Pascal等高级语言都是编译型语言。

编译型语言是指使用专门的编译器针对特定平台(操作系统)将某种高级语言源代码一次“翻译”为可在该平台硬件上执行的机器码(包括机器指令和操作数)

部分程序在编译结束后,通过组装并包装成该平台所能识别的可执行程序的格式,即两个以上的目标代码模块生成最终的可执行程序,实现低级代码复用。可能需要对其他编译好的目标代码进行链接编译型语言的程序编译到特定平台上的机器码中,因此需要编译生成的可执行程序可以脱离开发环境,在特定的平台上独立运行,如果需要移植,则将源代码复制到特定平台1.2说明型语言说明型语言是指编译生成的可执行程序通常无法移植到其他平台上运行

解释器语言通常不进行整体编译和链接处理。 由于每次运行解释器类型语言使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言解释器类型语言的程序相当于把编译型语言中的编译和解释过程混合到一起同时完成,解释器类型语言的程序运行效率通常很低,http://www.Sina . 在解释器类型语言中,都需要进行一次编译每个平台上的解释器将源程序解释为特定平台的计算机指令。 解释器语言很容易实现源代码级移植,但这牺牲了程序的执行效率。

1.3编译型语言VS解释器型语言

2 ) Python解释器Python语言是解释器类型语言,因此必须使用特定的解释器解释和运行Python程序。

解释器是什么? 解释器是运行其他程序的程序,使用不能脱离解释器独立运行

Python解释器本身也是一个程序,它解释和执行Python代码,因此称为解释器。 2.1 python解释器配置跨平台比较容易,只需提供特定平台的解释器即可

3358www.Sina.com/负责将源代码转换为字节码文件,并负责执行是代码与机器的计算机硬件之间的软件逻辑层字节码,因此解释器由一个编译器和一个虚拟机构成

CPython的具体内容如下。

Scanner支持词法分析器,将从文件输入的代码拆分为支持tokenParser的语法分析器,对Scanner的分析结果进行语法分析,创建ASTCompiler,然后根据创建的AST,生成指令集的Python 其中. pyc文件类似于Java.class文件。 最后,代码生成器执行代码Jython将重写解释器。 此时,Jvm是代码转换器的首席信息官

de Evaluator 就是通常所说的 pvm (Python虚拟机) 2.2 python代码执行过程

1、执行 python XX.py 后,将会启动 Python 的解释器。

2、python解释器的编译器会将.py源文件编译(解释)成字节码生成PyCodeObject字节码对象存放在内存中

转换后的字节码不是二进制的机器码,需要进一步编译才能被机器执行,这也是Python代码无法运行的像C/C++ 一样快的原因。

3、python解释器的虚拟机(PVM)将执行内存中的字节码对象转化为机器语言,虚拟机与操作系统交互,使机器语言在机器硬件上运行

PVM是 Python Virtual Machine的简称,它是Python的运行引擎

Python虚拟机的原理就是模拟可执行程序在X86机器上的运行。

当发生函数调用时,创建新的栈帧,对应Python的实现就是PyFrameObject对象。PyFrameObject对象创建程序运行时的动态信息,即执行环境每一个 PyFrameObject对象都维护了一个 PyCodeObject对象,这表明每一个 PyFrameObject中的动态内存空间对象都和源代码中的一段Code相对应。

4、程序运行结束后,根据命令行调用情况(即运行程序的方式)决定是否将PyCodeObject写回硬盘当中(也就是直接复制到.pyc或.pyo文件中)。

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
2.2 Python 解释器的种类

Python解释器有三种主要的实现方式,CPython、Jython和IronPython 三种实现方式。

CPython

CPython 是由C语言编写的,它是大多数Linux和Mac OS X机器预装的Python解释器,也是所有Python解释器中运行最快、最完整、最健全的

Jython

Jython 是一种Python语言的替代实现方式,其目的是为了与Java编程语言集成。

Jython 包含了Java类,这些类编译Python源代码、形成Java字节码,并将得到的字节码映射到Java虚拟机(JVM)上。因为Jython要比CPython 慢而且也不够健壮,它往往看作是一个主要面向寻找Java代码前端脚本语言的Java开发者的一个有趣的工具。 IronPython

IronPython 设计的目的是让Python 程序可以与Windows 平台上的.NET 框架以及与之对应的Linux的上开源的Mono编写成的应用集成。

其他: IPython:IPython是基于CPython之上的一个交互式解释器PyPy:PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
3)pyc文件

一个文件夹,用来存放模块和子包

包里一般会有一个__init__.py 的文件(也可以没有)。包里一般也会有一个__pycache__文件夹,存放 .py 文件经解释器解释后的中间字节码(二进制文件)。

模块: 可以作为模块的文件有 .py 、.pyc、.pyo、.pyd、.so、.dll文件。

3.1 什么是pyc文件?

pyc是一种二进制文件,是由py文件经过编译后生成的文件,是一种byte code。

py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的python是无法执行的。

pyc文件其实是PyCodeObject的一种持久化保存方式。

文件中包含python的magic number(来说明编译时使用的python版本号)、源文件的mtime(使pyc和py文件保持同步)、编译出的code对象。

*什么是PyCodeObject?

Python代码的编译结果就是PyCodeObject对象。PyCodeObject对象中包含了字节码指令以及程序的所有静态信息,但没有包含程序运行时的动态信息——执行环境(PyFrameObject)。字节码在python虚拟机程序里对应的是PyCodeObject对象。 为什么需要pyc?

因为py文件是可以直接看到源码的,如果是开发商业软件的话,不可能把源码泄漏出去,所以就需要编译为pyc后,再发布出去

当然,pyc文件也是可以反编译的,不同版本编译后的pyc文件是不同的。根据python源码中提供的opcode,可以根据pyc文件反编译出py文件源码
什么时候会生成pyc?

pyc文件只有在文件被当成模块导入时才会生成,即模块加载的时候(import)。

也就是说,Python解释器认为,只有import进行的模块才需要被重用。

主文件一般只需要加载一次不会被其他模块导入,所以一般主文件不会生成pyc文件

执行 python test.py 会对test.py进行编译成字节码并解释执行,但不会生成test.pyc如果test.py中加载了其他模块,如import urllib2,那么python会对urllib2.py进行编译成字节码,生成urllib2.pyc,然后对字节码解释执行。

加载模块时,如果同时存在.py和.pyc,python会使用.pyc运行

在生成pyc文件的同时,写入了一个Long型的变量,用于记录最近修改的时间,如果.pyc的编译时间早于.py的时间,则重新编译.py,并更新.pyc文件。
3.2 pyc文件的生成 代码编译生成:

对于单个文件,使用方法非常简单,如下所示,xxx.py是需要编译的python源文件:

import py_compile# py_compile是Python的自带模块 py_compile.compile('xxx.py')# py_compile.compile(file[, cfile[, dfile[, doraise]]])可将.py文件编译生成.pyc文件(默认)

对于多个文件一般来说:

我们的工程都是在一个目录下的,一般不会说仅仅编译一个py文件而已,而是需要把整个文件夹下的py文件都编译为pyc文件。python又为了我们提供了另一个模块:compileall 。使用方法如下:import compileallcompileall.compile_dir(r'/Users/xxx/PythonFiles/') Python Shell 命令生成:

直接通过命令来运行:

python3 -m py_compile ****.py//-m 表示把后面的模块当成脚本运行python3 -O -m py_compile ****.py //-O 优化成字节码

可以看到命令中并没有用到compile()函数,这是因为py_compile模块的main()函数中调用了compile()。

python3 -m py_compile ****.py其效果等效于如下代码:

import py_compilepy_compile.compile('****.py')# 也可以是包含.py文件的目录路径#此处尽可能使用raw字符串,从而避免转义的麻烦。比如,这里不加“r”的话,你就得对斜杠进行转义

如果你想看compile(), compile_dir(), compile_path()具体每个参数是干吗用的,可以使用print py_compile.compile().__doc__来查看,或者直接打开py_compile.py,compileall.py文件来看。

3.3 pyc文件的使用 直接使用python编译源码时,会生成对应的(.pyc)文件,这些文件会被存放在__pycache__文件夹下。

我们可以将里边的文件copy出来,这时候可以删除对应的.py文件,同时需要将xxx.pyc文件的名字进行修改

例如: python 的.py文件叫 main.py,生成的.pyc文件叫main.cpython-36.pyc,在我们使用该模块的时候,需要将main.cpython-36.pyc修改为main.pyc,这里的“cpython-36”表示的是我在python 3.6 的环境下编译的。

如果你直接从一个环境中copy到另一个环境中会出现一些bug,主要原因是编译的python版本与目前运行的python版本不同导致的。编译成.pyc文件之后,尽量保证编译环境与运行环境一致

【部分内容参考自】

Python程序运行机制详解(入门必读):http://c.biancheng.net/view/2166.html解释器和虚拟机的区别有哪些?:https://www.zhihu.com/question/59570108python 解释器及其工作原理:https://www.cnblogs.com/Bottle-cap/articles/10123700.htmlPython虚拟机运行原理:https://blog.csdn.net/qq_41312839/article/details/79470823python 编译pyc以及pyc包导入使用:https://blog.csdn.net/qq_32782339/article/details/109775099Python在什么时候会生成pyc文件呢?:https://www.jianshu.com/p/40a42bf1d15d

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。