ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python解释器相关知识

2021-11-13 18:33:19  阅读:115  来源: 互联网

标签:解释器 字节 Python 知识 计数 线程 执行 函数


解释器

解释器将代码编译成字节码执行。

查看字节码

使用__code__.co_code查看字节码;函数名不加括号在前

字节码的反汇编

将字节码以人类可读的方式输出
导入dis模块,使用dis.dis(函数名)查看
可以简单的产看解释器的执行过程
输出分为5列,分别代表:字节码对应在源码中的行号,字节码在字节码串中的第几个字节,字节码人类可读的命名,字节码参数,字节码参数的内容

帧是包含一端代码运行时所需的信息和环境,当调用一次函数时,就是进栈,函数结束时,栈被弹出,使用return value弹入下一个栈。每一帧对应一个函数的调用。一个函数可能有多个帧,比如递归(函数调用本身)

python解释器包含常用的三种栈,调用栈,数据栈,块栈。
调用栈:执行字节码时操作
数据栈:执行函数时操作
快栈:执行特定的控制流(循环、判断)

全局锁GIL

是让解释器在同一时刻仅有一个线程可被调度执行。对单核高效简单。
多核的话可以采用进程加协程来发挥多核环境计算能力
对于I-O密集型任务,线程会在发生阻塞时主动释放GIL,以便其他线程执行。
对于计算密集型任务,采取超时策略:
超时后,依然无法获取锁,则发出请求。对正在执行的线程在解释循环内会检查该标记,然后释放锁,切换其他线程执行,其自身进入等待状态(典型的协作机制)
CPython使用系统线程,且没有实现线程调度。所以,具体等待哪个线程被切换执行,有操作系统决定,甚至发出请求和被切换执行的也未必是用一线程。

垃圾回收

引用计数

每个对象头部都有一个引用计数器。引用该对象时,计数增加,反之减少。当技术归0时,立即调用回收函数清理并释放内存。
但引用计数一旦出错或忘记调用,要么计数无法归零导致内存泄漏,要么忘记增加计数让对象提前回收。
他还会引起内存管理问题,对象在传递过程中,即便内容未被修改,可引用计数依然让其内存发生了变动。这可能会导致CPU缓存错失率提升,甚至让写时复制(Copy-On-Write)机制失效。

循环引用

为实现循环引用垃圾回收,所有可能导致问题的容器类型,都必须使用专门的内存分配函数。

标签:解释器,字节,Python,知识,计数,线程,执行,函数
来源: https://www.cnblogs.com/wkhzwmr/p/15549340.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有