8

以下は に関するいくつかのテストですitertools.tee:

    li = [x for x in range(10)]
    ite = iter(li)
==================================================
    it = itertools.tee(ite, 5)
    >>> type(ite)
    <type 'listiterator'>
    >>> type(it)
    <type 'tuple'>
    >>> type(it[0])
    <type 'itertools.tee'>
    >>> 

    >>> list(ite)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[0])          # here I got nothing after 'list(ite)', why?
    []
    >>> list(it[1])
    []
====================play again===================
    >>> ite = iter(li)
    it = itertools.tee(ite, 5)
    >>> list(it[1])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[2])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[3])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[4])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(ite)
    []                       # why I got nothing? and why below line still have the data?   
    >>> list(it[0])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[0])
    []
====================play again===================    
    >>> ite = iter(li)
    itt = itertools.tee(it[0], 5)    # tee the iter's tee[0].
    >>> list(itt[0])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(itt[1])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[0])
    []                               # why this has no data?
    >>> list(it[1])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(ite)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  

私の質問は

  1. tee はどのように機能し、元の iter が「データを持っている」場合とそうでない場合があるのはなぜですか?
  2. イテレータのディープ コピーを「ステータス シード」として保持して、生のイテレータ ステータスを保持し、後で使用できるようにすることはできますか?
  3. 2 iters または 2 を交換できますitertools.teeか?

ありがとう!

4

1 に答える 1

15

tee元の反復子を引き継ぎます。ティーがイテレーターを所有したら、元のイテレーターを破棄します (自分が何をしているのか本当にわかっている場合を除きます)。

copyモジュールを使用してティーのコピーを作成できます。

import copy, itertools
it = [1,2,3,4]
a, b = itertools.tee(it)
c = copy.copy(a)

... または を呼び出すことによってa.__copy__()

tee元の反復子から消費されたすべての反復された値を追跡することによって機能することに注意してください。これはまだコピーによって消費される可能性があります。

例えば、

a = [1,2,3,4]
b, c = itertools.tee(a)
next(b)

この時点で、基礎bとなるティー オブジェクトcは 1 つの値 を読み取り1ました。いつ繰り返されるかを覚えておく必要があるため、それをメモリに保存していますc。ティーのすべてのコピーによって消費されるまで、すべての値をメモリに保持する必要があります。

この結果、ティーをコピーして「状態を保存」することに注意する必要があります。「保存された状態」ティーから実際に値を消費しない場合は、イテレーターによって返されたすべての値を永久に (コピーされたティーが破棄されて収集されるまで) ティーに保持させます。

于 2010-10-18T08:04:53.040 に答える