List comprehension dựng sẵn toàn bộ list trong RAM; generator expression trả về một iterator lười (lazy), chỉ tính từng phần tử khi được duyệt.
python
squares = [x * x for x in range(10_000_000)] # allocates ~400MB
total = sum(x * x for x in range(10_000_000)) # constant memoryKhác biệt thực tế:
- Bộ nhớ: genexp giữ một phần tử tại một thời điểm, hợp với file lớn, cursor DB, response stream.
- Một lần dùng: genexp cạn sau khi duyệt xong; duyệt lần hai ra rỗng. List thì duyệt lại bao nhiêu lần cũng được.
- API: genexp không có len(), không index, không slice.
- Lazy nghĩa là lỗi xảy ra muộn — exception chỉ nổ khi thực sự duyệt tới phần tử đó.
Chọn genexp khi dữ liệu lớn hoặc kết quả chỉ đi thẳng vào sum(), min(), any(), vòng for. Chọn list khi cần dùng lại, cần độ dài, hoặc cần truy cập ngẫu nhiên.