Python元组底层实现分析

元组的底层实现,真的是个被低估的冷门宝藏,尤其你要写扩展模块或者搞点性能优化的话,看看源码还挺有意思的。

Python 里头的tuple,看起来挺简单:不能改,可以当字典键,还经常被用来返回多个值。但深入源码你会发现,它其实蛮讲究的。像元组用的结构体PyTupleObject,就是 C 语言级别的底层实现,里面的ob_item[1]就是个变长数组,这种用法在 C 里挺常见,灵活又省事。

变长数组靠的是PyObject_VAR_HEAD来撑场子,它记录元素数量,配合内存分配器用的挺溜。你要创建个新的元组,Python 就用PyTuple_New来搞定。这里有个点挺巧妙:空元组其实是复用的——对,a=()b=()是一个对象,省内存不说,响应也快。

不过别以为都能省,像(1,)(1,)虽然内容一样,Python 还是会分配两个不同的对象。这种行为要是你用元组做缓存 Key 什么的,可得小心点,不然就踩坑了。源码里也讲了free list机制,空元组和小元组都能走缓存,挺适合频繁创建销毁的场景。

还有个点蛮值得注意的:ob_item数组存的全是PyObject*,这意味着你放啥都行,数字、字符串、甚至别的元组。Python 的这套设计,既灵活又安全,完全靠元组的不可变性来保障函数之间的数据传递不会被随便篡改。

如果你最近正打算写点 Python C 扩展,或者就是对解释器底层有点兴趣,这篇关于tuple实现的,挺值得一读。看完你对 Python 的内存管理、对象复用啥的,会有更直观的认识。

pdf 文件大小:248.99KB