A list comprehension creates a full list in memory at once.
[expression for item in iterable if condition]
squares = [x**2 for x in range(5)]
print(squares) # [0, 1, 4, 9, 16]
Returns a list object
Stores all elements in memory
Faster for small-to-medium size data
Can be nested or filtered
A generator expression returns a generator object, which generates items one at a time using lazy evaluation.
(expression for item in iterable if condition)
squares = (x**2 for x in range(5))
print(squares) # <generator object>
print(list(squares)) # [0, 1, 4, 9, 16]
Returns a generator object
Doesn’t store all values in memory
Efficient for large datasets
Generates values on-demand
Can be iterated only once
Feature | List Comprehension | Generator Expression |
---|---|---|
Brackets | [ ] |
( ) |
Return Type | list |
generator |
Memory Usage | High (stores all elements) | Low (generates one by one) |
Performance (small) | Faster | Slightly slower |
Performance (large) | May consume more memory | More scalable and memory efficient |
Reusability | Can be reused multiple times | Can only be iterated once |
Suitable For | Small/medium sequences | Large data or infinite sequences |
# Store even numbers in a list
evens = [x for x in range(1_000_000) if x % 2 == 0]
# Iterate even numbers one at a time
evens = (x for x in range(1_000_000) if x % 2 == 0)
for e in evens:
print(e)
When to Use | Use List Comprehension | Use Generator Expression |
---|---|---|
Need all items at once | ✅ Yes | ❌ Not ideal |
Working with large data | ❌ Can crash memory | ✅ Ideal due to lazy evaluation |
One-time use | ✅ Fine | ✅ Better |