Python 基础知识整理笔记

闹麻了,因为各种原因,现在需要重新回顾一下Python,话不多说,开始吧

1. Python是解释型语言 && Python与C++代码执行过程的区别:

(1)C++

源码(Source):C++的源码文件是 .cpp 文件

预处理(PreProcess):生成 .i 文件

预处理的操作有 处理 #include#define 等宏指令,

编译(Compile):将.cpp文件 编译为 .s 文件,此时的.s 文件是汇编文件,无法被CPU执行

编译加速方式有:

汇编(Assemble):将汇编文件.s 文件 转换为可以被CPU理解的 机器码 .o 文件

但此时的字节码文件仅仅将源码中包含的代码转化为了字节码,但由于源码中一般会涉及到链接库、标准库来支持代码的组织编写,因此,此时的字节码虽然可以被CPU理解,但无法运行。因为源码中链接库的位置 只是被填充上了 未解析的符号 ,此种情况下直接运行 .o 文件会报错 "未定义符号错误(undefined reference)。"

坚持要运行汇编生成的字节码文件也可以,通过 linux 的 ld 链接库工具,手动链接所需的库,如 `ld final_exe src.o XXX` 。对应的链接库位置被对应的符号填充

此外,.o 文件也没有指定程序入口位置,只是一个没有框架的代码片段,,这也是它不能被CPU直接执行的原因。

这时候是可以使用 ld 指令进行手动链接的指定的库,如下指令所示,来避免上述的问题,生成可执行文件

bash 复制代码
//通常编译会这样做:
gcc main.c -o main  # 完整的编译+链接,生成可执行文件


// -------------------------------------------------------------------

//但如果我们只编译不链接
gcc -c main.c -o main.o  # 只编译,生成目标文件 main.o

// 这时候 main 变成了可执行文件,可以直接运行:
// -lc 含义是链接到C语言标准库 --dynamic-linker 是在指定动态链接库
ld -o main main.o -lc --dynamic-linker /lib64/ld-linux-x86-64.so.2

// 顺利执行 main文件
./main

连接(Link):将源码与涉及的库相链接,生成可执行代码 .exe 文件或ELF

(2)Python

源码(Source):Python的源码文件是 .py 文件

解析(Parse):Python 解释器 将源码 解析为 语法树AST

编译(Compile):Python编译器将 语法树 编译为 字节码 (.pyc)

注意,此时的 字节码 并非是可以直接被CPU理解执行的内容,.pyc 仅可以被Python虚拟机所理解的中间形式

解释执行(Interpretation):Python 虚拟机(PVM)逐行将 字节码 进行解释执行

(3)区别:

对于C++来说,C++的编译器编译后会生成 可以被 CPU 直接理解执行 的 机器码,此时的CPU无需做其他处理,直接执行即可。因此,C++ 是编译型语言

对于Python来说,Python的编译器仅仅会将Python的源码转换为可供Python虚拟机理解的字节码 .pyc 文件,且对于Python语言来说,只需要执行 ` python test.py ` 即可,Python的编译过程对用户透明,这也是为什么 Python 被称为 "无显式编译"。编译生成的字节码 需要Python虚拟机PVM 逐行解释执行 .pyc 文件的字节码内容,而不会变成直接可以被CPU使用的机器码。

PVM接收到字节码文件,会逐行将字节码翻译成机器码,交给CPU使用。

注意,PVM是一个由C语言写的软件,运行在CPU上

2. 为什么 Python 比 C++ 慢?

(1)Python需要PVM一行行将字节码转换为机器码,而C++会一次性在编译过程中生成机器码

(2)Python需要动态内存回收,而C++可以手动指定

(3)Python的数据类型是运行时间决定的,而C++则是静态类型,优化更快

3. 如何加速Python的运行速度:

(1)使用JIT (Just in Time 编译方式),减少PVM的翻译成本

使用pypy代替CPython,将热点代码提前编译为机器码

使用Numba 加速,将数学计算部分提前编译为机器码

(2)核心代码使用C++编写,Python只做封装:

TensorFlow 底层使用C++,Python只做封装;

Numpy 的计算单元用C实现

(3) CPython

将Python代码转为C代码,再编译为机器码,加速执行

相关推荐
冷凌爱2 小时前
总结HTML中的文本标签
前端·笔记·html
保持学习ing2 小时前
黑马Java面试笔记之 集合篇(算法复杂度+ArrayList+LinkedList)
java·笔记·算法·面试
Moonnnn.3 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
fen_fen4 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法
FakeOccupational5 小时前
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 & 定向转发机制
笔记·分布式·p2p
布伦鸽6 小时前
C# WPF 左右布局实现学习笔记(1)
笔记·学习·c#·wpf
love530love6 小时前
【笔记】旧版MSYS2 环境中 Rust 升级问题及解决过程
开发语言·人工智能·windows·笔记·python·rust·virtualenv
黑色的山岗在沉睡7 小时前
《视觉SLAM十四讲》自用笔记 第二讲:SLAM系统概述
笔记
HappyAcmen8 小时前
1.3 古典概型和几何概型
笔记·概率论·学习方法
普宁彭于晏9 小时前
CSS3相关知识点
前端·css·笔记·学习·css3