Reputation: 631
While
list(enumerate(['a', 'b', 'c']))
has to load the list in memory,
list(zip(itertools.count(), ['a', 'b', 'c']))
generates the elements one at-a-time. Do I understand it correctly?
Upvotes: 1
Views: 431
Reputation: 11496
Whenever you do list(some_iterable)
, you are loading the contents of this iterable in memory in a list.
The following
def integer(x):
print("Generating", x)
return int(x)
print("[1]")
iterable = (integer(x) for x in range(10, 20))
print("[2]")
contents = list(iterable)
print("[3]")
for value in contents:
print(value)
will output
[1]
[2]
Generating 10
Generating 11
Generating 12
Generating 13
Generating 14
Generating 15
Generating 16
Generating 17
Generating 18
Generating 19
[3]
10
11
12
13
14
15
16
17
18
19
(Note that all elements are generated before the for-loop).
The following
def integer(x):
print("Generating", x)
return int(x)
print("[1]")
iterable = (integer(x) for x in range(10, 20))
print("[2]")
contents = iterable
print("[3]")
for value in contents:
print(value)
will output
[1]
[2]
[3]
Generating 10
10
Generating 11
11
Generating 12
12
Generating 13
13
Generating 14
14
Generating 15
15
Generating 16
16
Generating 17
17
Generating 18
18
Generating 19
19
(Note that all elements are generated during the for-loop.)
enumerate
is an iterator, as well zip
and itertools.count
.
Upvotes: 1