When is it better to use zip instead of itertools.izip?
The itertools library provides "iterators" for common Python functions. From the itertools docs, "Like zip() except that it returns an iterator instead of a list." The I in izip() means "iterator".
Python iterators are a "lazy loaded" sequence that saves memory over regular in-memory list. So, you would use itertools.izip(a, b) when the two inputs a, b are too big to keep in memory at one time.
Look up the Python concepts related to efficient sequential processing:
"generators" & "yield"
"iterators"
"lazy loading"