假设我复制了一个现有的列表:
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标准行为。
答案 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。