Python列表的内存管理

Python列表的内存管理,python,Python,假设有五个元素的列表。a=[1,2,4,5,6]。我想在两者之间插入元素3,那么如果我使用python的insert func会发生什么呢 仅为元素3分配的单独内存,其引用附加到现有的 将为整个列表和元素3分配一个新内存(大约是以前内存的1.3倍) 附属于它 列表项 如果选择1,那么为什么在python中insert()func的时间comp是o(n),而不是o(1)解决方案2是正确的-它将占用更多内存 Python对一切都有指针。因此,当您创建一个列表时,比如说foo=[3,4,5],py

假设有五个元素的列表。a=[1,2,4,5,6]。我想在两者之间插入元素3,那么如果我使用python的insert func会发生什么呢

  • 仅为元素3分配的单独内存,其引用附加到现有的
  • 将为整个列表和元素3分配一个新内存(大约是以前内存的1.3倍) 附属于它
  • 列表项



  • 如果选择1,那么为什么在python中insert()func的时间comp是o(n),而不是o(1)

    解决方案2是正确的-它将占用更多内存

    Python对一切都有指针。因此,当您创建一个列表时,比如说
    foo=[3,4,5]
    ,python将一个唯一的id附加到这个列表中,
    foo
    ,并将列表中的每个索引(位置)指向索引处的值的id

    当您执行
    foo.insert(add_index,val)
    时,您正在更改
    add_index
    之后所有索引的指针。这就是时间复杂度为O(n)的原因,因为n指针可能需要根据
    add_index
    变量进行更改


    内存不会随着您添加的内容线性扩展。列表使用的内存取决于添加的内容(str vs float vs int…)以及元素是否唯一(创建新指针vs引用旧指针)。在您的情况下,列表将占用大约(6/5)倍的内存是正确的。

    解决方案2是正确的-它将占用更多内存

    Python对一切都有指针。因此,当您创建一个列表时,比如说
    foo=[3,4,5]
    ,python将一个唯一的id附加到这个列表中,
    foo
    ,并将列表中的每个索引(位置)指向索引处的值的id

    当您执行
    foo.insert(add_index,val)
    时,您正在更改
    add_index
    之后所有索引的指针。这就是时间复杂度为O(n)的原因,因为n指针可能需要根据
    add_index
    变量进行更改


    内存不会随着您添加的内容线性扩展。列表使用的内存取决于添加的内容(str vs float vs int…)以及元素是否唯一(创建新指针vs引用旧指针)。在您的例子中,列表大约占用内存的(6/5)倍是正确的。

    嘿,这是python还是cpython?这是一个有点奇怪的问题,因为python本质上只是规则和语法。默认情况下,该语言的实际实现是使用cpython完成的,尽管还有其他实现。这可能很有用:嘿,这是python还是cpython?这是一个有点奇怪的问题,因为python本质上只是规则和语法。默认情况下,该语言的实际实现是使用cpython完成的,尽管还有其他实现。这可能是有益的: