Python是否对列表副本使用copy-on-write?

时间:2011-11-02 13:40:09

标签: python copy-on-write

假设我复制了一个现有的列表:

existing_list = [ 1, 2, 3 ];
copied_list = existing_list[:]

...

copied_list[2] = 'a' // COW happens here

[有些编辑]

我听说当duplicate_list或existing_list发生变异时,Python会使用copy-on-write。这是真的吗?

对我而言似乎过于复杂,需要锁定所有地方(想想多线程)。

为清楚起见:我不是在寻找COW impl。我只是想了解什么是Python标准行为。

4 个答案:

答案 0 :(得分:5)

没有写时复制。运行copied_list = existing_list[:]时,会立即构建并填充新列表。以下是来源:http://hg.python.org/cpython/file/2.7/Objects/listobject.c#l467

答案 1 :(得分:2)

这不是“写时复制”,这是“现有的引用在替换之前一直存在”。没什么好看的,继续前进。

答案 2 :(得分:2)

大多数Python实现无论如何都会在整个地方使用锁定,无论如何它都会破坏多线程(GIL)。但是,我仍然不认为使用copy-on-write。它需要进一步的锁定和组织,这是一个相当低级别的优化,并且复制的成本将比平时小,因为一切都是参考(所以你只需复制N个指针)。

如果您足够关心,可以阅读来源。我没有剖析所有可能复制的方法,但是快速搜索(“复制”,“写入”,“锁定”)没有发现任何指示COW或类似机制的东西。

答案 3 :(得分:1)

没有。如果您希望列表实现具有写时复制功能,请尝试blist