分享
Python核心面经
输入“/”快速插入内容
Python核心面经
用户5289
用户5289
2024年4月2日修改
执行流程
1.
将python代码编译成字节码(.pyc文件,二进制文件)
2.
python虚拟机解释执行字节码,此时需要将字节码转化为二进制机器语言(虚拟机创建字节码执行的上下文环境,模拟运行栈作为运行时环境)
a.
调用栈:函数的压栈
b.
运行栈
c.
快栈
语言特性
解释型语言和编译型语言
•
解释型:就是边解释边执行(php)
•
编译型:编译后再执行(c、java、c#)
•
混合型:Python首先编译为字节码,然后由CPython解释。
◦
性能低的原因:编译后的代码可以执行许多优化,而字节码是不可能的。
◦
优化方案:JIT编译器【通过对机器代码进行一些编译和一些解释来同时获得两种优势。】【1、识别代码中最常用的组件,如循环中的函数。2、运行时将这些部件转换为机器代码。3、优化生成的机器代码。4、用优化的机器代码版本取代之前的实现。】
python解释器
•
CPython:C语言的解释器,命令行下就是
•
Ipython:基于Cpython实现的交互性解释器
•
Pypy:利用JIT技术进行python代码的动态编译
◦
优点:通过对机器代码进行一些编译和一些解释来同时获得两种优势。
◦
缺点:无法适用于C扩展、只适用于长时间运行的程序【短程序根本不需要进行编译】
import导入系统
•
一切都是对象:不管是模块还是包,在Python中都是一样的,它们都是一个PyModuleObject
模块/包
•
Python中,不管是对常见的*.py文件,或是编译优化的*.pyc, *.pyo文件、扩展类型的*.pyd,*.pyw文件来说, 它们是属于Python代码载体的最小单元,这样单独存在的文件我们都称之为“模块”。
•
上述这样的多个模块组合在一起,我们就称之为“包”,而Python中,大家比较熟悉的包类型是包含__init__.py的包。通常来说,我们习惯创建包的步骤基本上都是新建目录A、新建__init__.py,再之后我们就可以愉快地导入包A了。
相对导入和绝对导入
代码块
Python
└── project
├── package1
│ ├── module1.py
│ └── module2.py
│ └── Function Fx
└── package2
├── __init__.py
│ └── Class Cx
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
└── Function Fy
•
绝对导入:绝对路径要求我们必须从最顶层的文件夹开始,为每个包或每个模块提供出完整详细的导入路径
◦
优点:层次清晰
◦
缺点:修改麻烦,包名太长了
代码块
Python
from package1 import mudule1
from package1.module2 import Fx
from package2 import Cx
from package2.subpackage1.module5 import Fy
•
相对导入:.表示当前文件所在的目录,如果是..就表示该目录的上一层目录
◦
优点:简洁