2

reversed(seq)Pythonの組み込みは、メソッドが必要であるか、シーケンス プロトコルをサポートするseq必要があることを示します。__reversed__()リストとタプルはどちらも明らかにシーケンス プロトコルをサポートしていますが、代わりにリストには独自の__reversed__()メソッドが使用されています。

>>> hasattr(list, '__reversed__')
True
>>> hasattr(tuple, '__reversed__')
False

__reverse__()次に、シーケンスプロトコルが逆に提供するよりも、リストの最適化が高速である必要があります。そこで、listobject.c に実装されているソース コードを調べましたが、C の知識が非常に限られているため、タプル ( __reversed__()tupleobject.c ) が同様の内部反転メソッドを持たない理由を理解できません。PyTuple_MAXSAVESIZE割り当てとメモリのいくつかの最適化 ( ) を使用して配列を Bean に変換し、リストをより使い慣れた配列にします。

__reversed__()メソッドの実装をリスト型の最適化にする、私が見逃しているCの魔法は何ですか?タプルには標準の反復子プロトコルの方が適していますか?

4

1 に答える 1

4

タプルが逆の順序で繰り返されることはめったにありません。

これは、タプルが異種であり、リストが同種であるためです。リストには順序がありますが、タプルには構造があります。その結果、タプルは比較的小さく、リストは (非常に) 大きくなる可能性があります。リストとタプルの違いを参照してください。

そのため、タプルの逆反復子を作成する必要はまったくありません。それは時期尚早の最適化であり、わずかな利益しか得られないメンテナンス コストが発生します。

于 2016-05-23T13:50:39.783 に答える