itertools.teeの動作方法は、「ステータス」を保存するために「itertools.tee」を複製することができますか?
-
08-10-2019 - |
質問
以下はいくつかのテストです 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]
私の質問はです
- TEEはどのように機能し、なぜ元のIterに「データがある」のか、そして他の時間はそうではありませんか?
- Iterの深いコピーを「ステータスシード」として保持して、生のイテレータステータスを保持し、後で使用するために使用することはできますか?
- 2つまたは2つを交換できますか?
itertools.tee
?
ありがとう!
解決
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
繰り返されます。ティーのすべてのコピーによって消費されるまで、すべての価値をメモリに保つ必要があります。
この結果、ティーをコピーすることで「節約状態」に注意する必要があるということです。 「保存された状態」ティーから実際に値を消費しない場合、ティーに保持することになります すべての値 メモリのイテレーターによって永遠に返されます(コピーされたティーが破棄されて収集されるまで)。
所属していません StackOverflow