2 回使用zip
:
>>> ids = [1,2,3,4]
>>> x_pos = [1.32, 2.34, 5.56, 8.79]
>>> y_pos = [1.2, 2.3, 3.4, 4.5]
>>> z_pos = [3.33, 2.22, 10.98, 10.1]
>>> dict(zip(ids, zip(x_pos, y_pos, z_pos)))
{1: (1.32, 1.2, 3.33), 2: (2.34, 2.3, 2.22), 3: (5.56, 3.4, 10.98), 4: (8.79, 4.5, 10.1)}
genexp とのタイミング比較:
>>> import timeit
>>> timeit.timeit('dict(zip(ids, zip(x_pos, y_pos, z_pos)))', 'from __main__ import ids, x_pos, y_pos, z_pos')
1.6184730529785156
>>> timeit.timeit('dict((x[0], x[1:]) for x in zip(ids, x_pos, y_pos, z_pos))', 'from __main__ import ids, x_pos, y_pos, z_pos')
2.5186140537261963
したがって、zip
2 回使用すると、ジェネレーター式を使用するよりも約 1.5 倍高速になります。明らかに、結果はイテラブルのサイズに依存しますが、 double を使用するzip
と、少なくとも CPython 2 では常に明示的なループよりも高速になるという事実に自信を持っています。ジェネレーターの例外またはfor
ループは、 への 1 回の呼び出しよりもはるかに多くの作業をインタープリターに必要としzip
ます。これにより、反復プロセスからいくらかのオーバーヘッドが取り除かれます。
itertools.izip
代わりに使用zip
してもタイミングはあまり変わりませんが、大きなデータセットのメモリ効率が大幅に向上します。