GVKun编程网logo

如何在CPython中实现元组?(cpython cython)

18

本文将带您了解关于如何在CPython中实现元组?的新内容,同时我们还将为您解释cpythoncython的相关知识,另外,我们还将为您提供关于python-如何在python中更详细地规范二维num

本文将带您了解关于如何在CPython中实现元组?的新内容,同时我们还将为您解释cpython cython的相关知识,另外,我们还将为您提供关于python-如何在python中更详细地规范二维numpy数组?、Python字节码如何在CPython中运行?、在Cpython中可以做些什么在IronPython中无法完成?、如何从python中的列表中删除重复的元组?的实用信息。

本文目录一览:

如何在CPython中实现元组?(cpython cython)

如何在CPython中实现元组?(cpython cython)

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

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

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

答案1

小编典典

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

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

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

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

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

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

希望这可以帮助!

python-如何在python中更详细地规范二维numpy数组?

python-如何在python中更详细地规范二维numpy数组?

给定3乘3的numpy数组

a = numpy.arange(0,27,3).reshape(3,3)# array([[ 0,  3,  6],#        [ 9, 12, 15],#        [18, 21, 24]])

为了规范二维数组的行,我想到了

row_sums = a.sum(axis=1) # array([ 9, 36, 63])new_matrix = numpy.zeros((3,3))for i, (row, row_sum) in enumerate(zip(a, row_sums)):    new_matrix[i,:] = row / row_sum

必须有更好的方法,不是吗?

可能需要澄清:通过标准化我的意思是,每行条目的总和必须为1。但是我认为这对于大多数人来说都是显而易见的。

答案1

小编典典

广播确实对此有好处:

row_sums = a.sum(axis=1)new_matrix = a / row_sums[:, numpy.newaxis]

row_sums[:, numpy.newaxis]重塑row_sums从存在(3,)到存在(3, 1)。当你这样做a /bab会相互播出。

您可以
在此处
了解更多有关 广播的
信息
,甚至可以
在此处
了解更多。

Python字节码如何在CPython中运行?

Python字节码如何在CPython中运行?

我试图了解Python的工作原理(因为我一直都在使用它!)。据我了解,当您运行python
script.py之类的脚本时,该脚本将转换为字节码,然后解释器/ VM /
CPython(实际上只是一个C程序)读取python字节码并相应地执行该程序。

该字节码如何读入?它类似于在C语言中读取文本文件的方式吗?我不确定Python代码如何转换为机器代码。是否确实是Python解释器(CLI中的python命令)只是一个预编译的C程序,该程序已经转换为机器代码,然后将python字节码文件放入该程序中?换句话说,我的Python程序是否从未真正转换为机器代码?python解释器已经存在于机器代码中了,所以我的脚本就不必了吗?

答案1

小编典典

是的,您的理解是正确的。在CPython解释器中,基本上(非常基本上)有一个巨大的switch语句,上面写着“如果当前操作码是这样,那么就这样做”。

http://hg.python.org/cpython/file/3.3/Python/ceval.c#l790

其他实现(例如Pypy)具有JIT编译功能,即它们可以将Python即时转换为机器代码。

在Cpython中可以做些什么在IronPython中无法完成?

在Cpython中可以做些什么在IronPython中无法完成?

在Cpython中可以做些什么在IronPython中无法完成?

最佳答案
如果您正在编写“100%纯Python”,那么您可以执行cpython在IronPython中可以执行的所有操作.当您想要使用第三方软件包时,会出现此问题.他们中的许多人都会在C中编写性能密集的部分,并依赖于Python / C API(例如NumPy).

作为将.NET组件连接在一起的粘合语言,IronPython非常棒.

如何从python中的列表中删除重复的元组?

如何从python中的列表中删除重复的元组?

我有一个包含元组列表的列表,如下所示。

mylist = [[''xxx'', 879], [''yyy'', 315], [''xxx'', 879], [''zzz'', 171], [''yyy'', 315]]

我想从中删除重复的元组,mylist并得到如下输出。

mylist = [[''xxx'', 879], [''yyy'', 315], [''zzz'', 171]]

似乎set在python中不起作用。

mylist = list(set(mylist))

在python中有什么快速简便的方法(也许使用库)吗?

答案1

小编典典

您需要编写保留第一个子列表的代码,其余部分删除。执行此操作的最简单方法是反转mylist,将其加载到dict对象中,然后再次将其键值对作为列表检索。

>>> list(map(list, dict(mylist).items()))

或者,使用 列表理解 -

>>> [list(v) for v in dict(mylist).items()][[''zzz'', 171], [''yyy'', 315], [''xxx'', 879]]

注意,此答案不维护顺序!另外,如果您的子列表可以包含两个以上的元素,那么最好的方法就是对哈希数据的哈希化版本进行哈希处理。

今天关于如何在CPython中实现元组?cpython cython的分享就到这里,希望大家有所收获,若想了解更多关于python-如何在python中更详细地规范二维numpy数组?、Python字节码如何在CPython中运行?、在Cpython中可以做些什么在IronPython中无法完成?、如何从python中的列表中删除重复的元组?等相关知识,可以在本站进行查询。

本文标签: