【发布时间】:2012-12-05 10:46:24
【问题描述】:
最近我正在使用 python 来处理几百万个大小的列表。
这里我有一个列表E,它有1,470,000个元素,每个元素是一个包含2个整数的列表。
E 看起来像:[[1, 3], [2, 4], [4, 7] ... ]
我想分别获取第一列和第二列的最大数量。
我可以通过使用列表推导得到它
m1 = max([e[0] for e in E])
m2 = max([e[1] for e in E])
return (m1, m2)
另一种方法是使用zip:
list(map(max, zip(*E)))
起初我认为第二种方式应该更快,因为列表理解将构建一个大列表(更重要的是,两次)。但事实证明列表理解非常快,使用 zip 的方法慢了大约 10 ~ 20 倍(使用 cProfile)。
我认为 zip 不应该那么慢,(更何况,列表理解怎么会那么快?)谁能告诉我原因?
我正在使用 python 3.2
附:通过使用 Windows 任务管理器,我什至看不到任何内存跟踪表明 python 曾经创建过一个新列表。一定有黑魔法。
【问题讨论】:
-
我不知道 Python 是否需要以特定顺序评估元组的元素,但如果不需要(并且您使用的是 Python 2.x)那么我认为是未定义的行为...
e在两个列表推导中是同一个变量。 -
如果您正在处理这样的事情 - 您是否考虑过使用 numpy...?
>>> a = np.array([ [1, 2], [3, 4], [5, 6] ]) >>> a.max(axis=0) array([5, 6]) -
@Mehrdad 对不起,我的示例代码令人困惑。但是即使我完全分开计算两个最大值,它仍然会快得多,我无法理解。
标签: python performance zip list-comprehension