Python 基础知识整理笔记

embedded/2025/3/19 12:45:38/

闹麻了,因为各种原因,现在需要重新回顾一下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 指令进行手动链接的指定的库,如下指令所示,来避免上述的问题,生成可执行文件

//通常编译会这样做:
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代码,再编译为机器码,加速执行


http://www.ppmy.cn/embedded/173861.html

相关文章

【gopher的java学习笔记】本地调试时配置Feign接口URL的实用指南

在微服务架构中,Feign作为声明式HTTP客户端简化了服务间调用,但在本地开发调试时,常因服务未注册到注册中心或需要绕过服务发现直接访问特定实例,需手动配置Feign的URL。本文将介绍三种主流配置方式,帮助开发者灵活应对…

软考网络安全专业

随着信息技术的迅猛发展,网络安全问题日益凸显,成为社会各界普遍关注的焦点。在这样的背景下,软考网络安全专业应运而生,为培养高素质的网络安全人才提供了有力支撑。本文将对软考网络安全专业进行深入剖析,探讨其在信…

什么是YApi?开源接口管理平台部署教程

YApi 到底是个啥? 各位小伙伴们好呀!今天要给大家介绍的是一款超级好用的接口管理神器——YApi!它是一个高效、易用、功能强大的 API 管理平台,简直就是开发、产品、测试人员的福音啊!!!它能帮…

PCIe信号传输的幕后:HCSL与LP-HCSL深度解析

在数字化浪潮席卷的当下,PCIe(Peripheral Component Interconnect Express)作为高速串行计算机扩展总线标准,已然成为计算机内部硬件设备连接领域的中流砥柱。其信号传输的质量与完整性,恰似计算机系统运行的 “命门”…

创建系统还原点,保护系统安全

在我们使用电脑时,经常会因为系统设置问题,中毒,驱动,注册表等等问题导致系统无法正常运行,甚至崩溃 其实,Windows内置了像手机一样的还原功能,只要平时创建了还原点,出现问题时就可…

进程与线程

进程与线程 procfork.cgetpid.cn_proc.cproc_num.cexit/_exitatexit.cwait.cwaitpid.cwaitpid_lianxi.cexecl.cexec_workminishell threadpthread_selfpthread_exitpthread_canclepthread_limitpthread_joinpthread_join2pthread_argspthread_args2pthread_detachpthread_clean…

51单片机和STM32 入门分析

51单片机和STM32是嵌入式开发中两种主流的微控制器,它们在架构、性能、应用场景等方面存在显著差异。以下是两者的对比分析及选择建议: 1. 51单片机与STM32的定义与特点 51单片机 定义:基于Intel 8051内核的8位微控制器,结构简单…

STM32 系统滴答定时器

定时器 定时器的本质:有规律的计数 有规律:计数速度 来自总线时钟频率 计数 :定时器中会后可控计数器 定时器形成时间的原理:(时间) 通过时钟源可知1s计数次数(计数频率) 通过要定时的秒数 * 每秒计数的次数 来决定定时器中的计数器所需要计数的次数 例子&am…