使用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
两次比使用生成器表达式快大约 1.5 倍。显然,结果取决于迭代的大小,但我对使用 double 的事实非常有信心zip
,至少在 CPython 2 上总是比显式循环快。生成器异常或for
循环需要解释器比单次调用更多的工作zip
,这消除了迭代过程的一些开销。
使用itertools.izip
而不是zip
不会改变太多时间,但对于大数据集来说内存效率要高得多。