Interview question
What is the difference between a generator expression and a list comprehension? Generator expression और list comprehension में क्या अंतर है?
Answer
| Aspect | List comprehension | Generator expression |
|---|---|---|
| Syntax | [x for x in ...] | (x for x in ...) |
| Evaluation | Eager - computes all values immediately | Lazy - computes values on demand |
| Memory | Stores entire result in memory | Minimal memory - one value at a time |
| Reusability | Can be iterated multiple times | Single-use, exhausted after one pass |
import sys
# List comprehension - all values computed and stored immediately
list_comp = [x**2 for x in range(1000000)]
print(sys.getsizeof(list_comp)) # large - ~8MB+ for a million ints
# Generator expression - values computed lazily, one at a time
gen_exp = (x**2 for x in range(1000000))
print(sys.getsizeof(gen_exp)) # tiny - ~200 bytes regardless of range size
# Both can be iterated the same way
for val in gen_exp:
if val > 20:
break
print(val)
# Generators are exhausted after one full iteration
gen = (x for x in range(3))
print(list(gen)) # [0, 1, 2]
print(list(gen)) # [] - already exhausted, second call gets nothing
# Lists can be iterated repeatedly
lst = [x for x in range(3)]
print(list(lst)) # [0, 1, 2]
print(list(lst)) # [0, 1, 2] - works again
# When to use which: generator expressions for large/streaming data
# processed once; list comprehensions when you need random access,
# multiple iterations, or len()
total = sum(x**2 for x in range(1000000)) # generator, memory-efficient sum| पहलू | List comprehension | Generator expression |
|---|---|---|
| Syntax | [x for x in ...] | (x for x in ...) |
| Evaluation | Eager - सारी values तुरंत | Lazy - demand पर |
| Memory | पूरा result memory में | बहुत कम memory |
| Reusability | कई बार iterate हो सकता है | एक बार use, फिर exhaust |
import sys
list_comp = [x**2 for x in range(1000000)]
print(sys.getsizeof(list_comp)) # बड़ा size
gen_exp = (x**2 for x in range(1000000))
print(sys.getsizeof(gen_exp)) # बहुत छोटा size
for val in gen_exp:
if val > 20:
break
print(val)
# Generator एक बार पूरा iterate होने पर exhaust हो जाता है
gen = (x for x in range(3))
print(list(gen)) # [0, 1, 2]
print(list(gen)) # [] - exhausted
# Lists बार-बार iterate हो सकती हैं
lst = [x for x in range(3)]
print(list(lst)) # [0, 1, 2]
print(list(lst)) # [0, 1, 2] - फिर काम करता है
total = sum(x**2 for x in range(1000000)) # memory-efficient sumWas this answer clear?