当前位置: 首页 > 面试题库 >

如何在CPython中实现元组?

阮选
2023-03-14
问题内容

我一直在尝试学习如何在场景下实现CPython。Python是高级的,这很好,但是我不喜欢将其视为黑匣子。

考虑到这一点,元组如何实现?我已经看过源代码(tupleobject.c),但它已经超出我的头了。

我看到的PyTuple_MAXSAVESIZE = 20PyTuple_MAXFREELIST = 2000,什么是节约型和“自由列表”?(长度为20/21或2000/2001的元组之间会有性能差异吗?是什么导致了最大元组长度的强制执行?)


问题答案:

请注意,此答案中的所有内容都是基于我从查看所链接的实现中所获得的信息。

似乎元组的标准实现只是简单地作为一个数组。但是,有很多优化措施可以加快处理速度。

首先,如果您尝试制作一个空元组,则CPython会交出代表该空元组的规范对象。结果,它可以节省仅分配单个对象的大量分配。

接下来,为避免分配一堆小对象,CPython会为许多小列表回收内存。有一个固定的常量(PyTuple_MAXSAVESIZE),使得所有小于此长度的元组都有资格回收其空间。每当释放长度小于此常量的对象时,就有可能不释放与其关联的内存,而是根据其大小将其存储在“空闲列表”中(在下一段中有更多说明)。
。这样,如果您需要分配一个大小为n的元组并且以前已经分配了一个元组并且不再使用它,则CPython可以回收旧数组。

自由列表本身实现为一个大小数组,PyTuple_MAXSAVESIZE用于存储指向未使用的元组的指针,其中数组的第n个元素指向NULL(如果没有大小为n的额外元组可用)或指向大小为n的回收元组。如果存在多个可重复使用的大小为n的不同元组,则通过使每个元组的第零入口指向下一个可重复使用的元组,将它们链接在一起形成一种链表。(由于仅分配了一个长度为零的元组,因此永远不会存在读取不存在的第零个元素的风险)。这样,分配器可以存储每种大小的一些元组以供重用。为了确保这不会占用太多内存,请使用第二个常量PyTuple_MAXFREELIST)来控制任何存储桶中任何这些链接列表的最大长度。然后有一个辅助长度数组,PyTuple_MAXSAVESIZE用于存储每个给定长度的元组的链表的长度,以便不超过此上限。

总而言之,这是一个非常聪明的实现!

希望这可以帮助!



 类似资料:
  • 问题内容: 我已经读过在CPython中,解释器堆栈(为此目的而调用的Python函数的列表)与C堆栈(在解释器自己的代码中调用的C函数的列表)混合在一起。如果是这样,那么如何实现生成器和协程?他们如何记住执行状态?CPython是否将每个生成器/协程的堆栈复制到OS堆栈或从OS堆栈复制?还是CPython只是将生成器的最高堆栈帧保留在堆上,因为生成器只能从该最高帧产生? 问题答案: 该指令将当前

  • 问题内容: 我试图了解Python的工作原理(因为我一直都在使用它!)。据我了解,当您运行python script.py之类的脚本时,该脚本将转换为字节码,然后解释器/ VM / CPython(实际上只是一个C程序)读取python字节码并相应地执行该程序。 该字节码如何读入?它类似于在C语言中读取文本文件的方式吗?我不确定Python代码如何转换为机器代码。是否确实是Python解释器(CL

  • 问题内容: 来自Google开源博客: PyPy是Python中Python的重新实现,它使用先进的技术来尝试获得比CPython更好的性能。多年的努力终于有了回报。我们的速度结果通常会击败CPython,从稍慢的速度到实际应用程序代码的速度提高2倍,再到小型基准测试的速度提高10倍。 这怎么可能?哪个Python实现用于实现PyPy?CPython的?PyPyPy或PyPyPyPy击败他们的分数

  • 问题内容: 数组在Java中被实现为对象,对吗?如果是这样,我可以在哪里查看数组类的源代码。我想知道数组中的length变量是否定义为常量,如果是这样,为什么不是全部使用大写字母LENGTH来使代码更易于理解。 问题答案: 尽管从它们继承java.lang.Object的角度来看,数组是Object,但是这些类是作为语言的特殊功能动态创建的。它们未在源代码中定义。 考虑以下数组: 没有这样的源代码

  • 本文向大家介绍如何实现元素的垂直居中?相关面试题,主要包含被问及如何实现元素的垂直居中?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 法一:父元素display:flex,align-items:center; 法二:元素绝对定位,top:50%,margin-top:-(高度/2) 法三:高度不确定用transform:translateY(-50%) 法四:父元素table布局,子元

  • CPython是用C语言实现的Python解释器,也是官方的并且是最广泛使用的Python解释器。除了CPython以外,还有用JAVA实现的Jython和用.NET实现的IronPython,使Python方便地和JAVA程序、.NET程序集成。另外还有一些实验性的Python解释器比如PyPy。 CPython是使用字节码的解释器,任何程序源代码在执行之前先要编译成字节码。它还有和几种其它语言(包括C语言)交互的外部函数接口。