2

既存のリストをコピーするとします。

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

...

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

【一部編集】

Python は、copyed_list または existing_list が変更されたときにコピー オン ライトを使用すると聞きました。これは本当ですか?

至る所でロックを必要とする複雑すぎるように思えます(マルチスレッドを考えてください)。

明確にするために: COW impl を探しているわけではありません。私はPythonの標準的な動作を理解しようとしています。

4

4 に答える 4

6

コピーオンライトはありません。を実行するcopied_list = existing_list[:]と、新しいリストが作成され、すぐに入力されます。ソースは次のとおりです: http://hg.python.org/cpython/file/2.7/Objects/listobject.c#l467

于 2011-11-02T15:04:34.847 に答える
2

これは「コピーオンライト」ではなく、「既存の参照は置き換えられるまで存在し続ける」です。ここには何もありません。先に進んでください。

于 2011-11-02T13:42:52.243 に答える
2

とにかく、ほとんどの Python 実装はいたるところでロックを使用し、とにかくマルチスレッド ( GIL ) を台無しにします。それでも、コピーオンライトは使用されていないと思います。さらにロックと編成が必要です。これはかなり低レベルの最適化であり、すべてが参照であるため、コピーのコストは通常​​よりも小さくなります (つまり、N 個のポインターをコピーするだけです)。

十分に気にするなら、ソースを読むことができます。コピーする可能性のあるすべてのメソッドを分析したわけではありませんが、クイック検索 (「コピー」、「書き込み」、「ロック」) では、COW または同様のメカニズムを示すものは見つかりませんでした。

于 2011-11-02T13:44:46.570 に答える
1

いいえ。コピー オン ライトを使用したリストの実装が必要な場合は、blistを試してください。

于 2011-11-02T13:45:12.440 に答える