
Python专栏
主要包括《Python源码剖析》、《Dive into Python》等的读书笔记以及其他与Python相关的知识
zhsenl
这个作者很懒,什么都没留下…
展开
-
《python源码剖析》笔记 pythonm内存管理机制
1.内存管理架构Python的内存管理机制都有两套实现:debug模式和release模式Python内存管理机制的层次结构:图16-1第0层是操作系统提供的内存管理接口,如malloc、free第1层是Python基于第0层操作系统的内存管理接口包装而成的,主要是为了处理与平台相关的内存分配行为。实现是一组以PyMem_为前缀的函数族两套接口:函数和宏。宏,可以避免函数调用的开销,提高效率,但可能与新版本的python产生二进制不兼容,如果用C来编写Python的扩展模块,使用函数接原创 2014-07-08 15:17:51 · 2808 阅读 · 0 评论 -
《python源码剖析》笔记 python多线程机制
1.GIL与线程调度Python中的线程是操作系统的原生线程,Python虚拟机使用一个全局解释器锁(Global Interpreter Lock)来互斥线程对Python虚拟机的使用为了支持多线程机制,一个基本的要求就是需要实现不同线程对共享资源访问的互斥,所以引入了GIL。GIL:在一个线程拥有了解释器的访问权之后,其他的所有线程都必须等待它释放解释器的访问权,即使这些线程的下一条指令并不会互相影响。在调用任何Python C API之前,要先获得GILGIL缺点:多处理器退化为单处理器;优原创 2014-06-23 21:08:54 · 2391 阅读 · 0 评论 -
《python源码剖析》笔记 python环境初始化
1.线程环境初始化图13-1Py_InitializeEx,Python会首先调用 PyInterpreterState_New创建一个崭新的PyInterpreterState对象。图13-2创建了PyInterpreterState(进程状态)对象之后,Python会调用PyThreadState_New创建PyThreadState(线程状态)对象图13-3全局变量_PyThreadState_Current维护着当前活动的线程PyInterpreterState对象中维护着所有的PyT原创 2014-06-23 18:47:16 · 1728 阅读 · 0 评论 -
《python源码剖析》笔记 python虚拟机中的函数机制
1.Python虚拟机在执行函数调用时会动态地创建新的 PyFrameObject对象,这些PyFrameObject对象之间会形成PyFrameObject对象链,模拟x86平台上运行时栈2.PyFuctionObject对象typedef struct { PyObject_HEAD PyObject *func_code; //对应函数编译后的PyCodeObject对象 PyObject *func_globals; //函数运行时的global空间 PyObject *func_原创 2014-06-22 15:26:14 · 1967 阅读 · 0 评论 -
《python源码剖析》笔记 python虚拟机中的一般表达式
1.字节码指令LOAD_CONST:从consts表中读取序号为i的元素并压入到运行时栈中STORE_NAME:改变local名字空间。从符号表names取序号为i的元素作为变量名, 取运行时栈的栈顶元素作为变量值,完成从变量名到变量值的映射关系的创建。BUILD_MAP:创建一个空的PyDictObject对象,并压入运行时栈DUP_TOP:将栈顶元素的引用计数增加1,并将它再次压入栈中ROT_TWO:将栈顶的两个元素进行对调LOAD_NAME:符号搜索,并将该元素压入运行时栈Py原创 2014-06-17 17:09:49 · 1281 阅读 · 0 评论 -
《python源码剖析》笔记 Python虚拟机框架
1.Python虚拟机会从编译得到的PyCodeObject对象中依次读入每一条字节码指令,并在当前的上下文环境中执行这条字节码指令。Python虚拟机实际上是在模拟操作中执行文件的过程PyCodeObject对象中包含了字节码指令以及程序的所有静态信息,但没有包含程序运行时的动态信息——执行环境(PyFrameObject)2.Python源码中的PyFrameObjecttypedef struct _frame{ PyObject_VAR_HEAD //"运行时栈"的大小是不确定的原创 2014-06-17 17:05:12 · 2905 阅读 · 0 评论 -
《python源码剖析》笔记 Python的编译结果
1.python的执行过程1)对python源代码进行编译,产生字节码2)将编译结果交给python虚拟机,由虚拟机按照顺序一条一条地执行字节码,产生执行结果图7-12.Python编译器的编译结果——PyCodeObject对象Python编译器的编译结果中包含了字符串、常量值、字节码等在源代码中出现的一切有用的静态信息。在Python运行期间,这些静态信息被PyCodeObject对象中在Python运行结束后,这些信息会被存储在pyc文件中PyCodeObject对象和pyc文件是原创 2014-06-15 18:49:16 · 1420 阅读 · 0 评论 -
《python源码剖析》笔记 python中的Dict对象
1.PyDictObject对象 --> C++ STL中的map是基于RB-tree的,搜索时间复杂度是O(logN) PyDictObject采用了hash表,时间复杂度是O(1)typedef struct{ Py_ssize_t me_hash; //me_key的hash值,避免每次查询都要重新计算一遍hash值 PyObject *me_key; PyObject *me_value;}PyDictEntry;将(key,value)对称为entry,它可以在3种状态原创 2014-06-15 18:45:39 · 1111 阅读 · 0 评论 -
《python源码剖析》笔记 python中的List对象
1.PyListObject对象 --> 变长可变对象,可看作vector<PyObject *>typedef struct{ PyObject_VAR_HEAD //其中的ob_size表示实际被使用的内存的数量 PyObject **ob_item;//ob_item为指向元素列表的指针,实际上,Python中的list[0]就是ob_item[0] int allocated;//当前列表中可容纳的元素的总数}PyList_Type 对象 --> PyListObject的类型对象ty原创 2014-06-15 18:34:51 · 1346 阅读 · 3 评论 -
《python源码剖析》笔记 python中的字符串对象
1. PyStringObject --> 变长不可变对象typedef struct{ PyObject_VAR_HEAD//ob_size变量保存着对象中维护的可变长度内存的大小 longob_shash; //缓存该对象的hash值,用于dict的查询 intob_sstate; //标志该对象是否经过intern机制的处理 char ob_sval[1];// 字符指针,指向一段内存} PyStri原创 2014-06-13 18:13:35 · 991 阅读 · 0 评论 -
《python源码剖析》笔记 python中的整数对象
1. PyIntObject --> long的一个简单包装typedef struct{ PyObject_HEAD long ob_ival;} PyIntObject;PyInt_Type --> PyIntObject的类型对象。与对象相关的元信息实际上都是保存在与对象对应的类型对象中的PyTypeObject PyInt_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, “int”, //…}PyIntObject 所原创 2014-06-13 17:56:24 · 1116 阅读 · 0 评论 -
《python源码剖析》笔记 python对象初探
1. 在python中,对象就是为C中的结构体在堆上申请的一块内存。对象不能被静态初始化,也不能在栈空间生存。但内建的类型对象都是被静态初始化的。2. 对象创建后大小不变。可变对象有一指针指向可变大小的内存区域。3. 对象机制的基石:PyObject原创 2014-06-13 17:44:34 · 1286 阅读 · 0 评论