Pythonのzipとizipの違い

zipは以前ちょっと書いたけど、複数のシーケンスに並行して同時にアクセスするforループを書くのに便利。

http://d.hatena.ne.jp/yuheiomori0718/20120626/1340721471

# coding=utf-8

seq1 = [1,2,3,4,5]
seq2 = ['a','b','c','d','e']

for n, a in zip(seq1, seq2):
    print n, a

# 1 a
# 2 b
# 3 c
# 4 d
# 5 e


itertools.izipも実行結果は全く同じに見える

# coding=utf-8
from itertools import izip

seq1 = [1,2,3,4,5]
seq2 = ['a','b','c','d','e']

for n, a in izip(seq1, seq2):
    print n, a 

# 1 a
# 2 b
# 3 c
# 4 d
# 5 e


違いは、zipがリストを返すのに対し、izipはイテレータを返す点。

上記の例でseq1、seq2が非常に大きいリストであるとすると、zipは呼び出したタイミングで、seq1、2と同じサイズのタプルのリストを作成するので、かなりメモリを消費するのに対し、izipはメモリ消費が少なくてすみます。


こう書くとzipのメリットが全然ないような気がするんですが、、調べてみたらPython3ではitertools.izipが無くなり、zipがイテレータを返すようになるみたいですね。


参考)

python2 zip
http://docs.python.org/library/functions.html#zip

python3 zip
http://docs.python.org/release/3.1.5/library/functions.html#zip