我有两个(非常长的)列表。我想要找到每对中最小值的总和。例如,如果
X = [2,3,4]
Y = [5,4,2]
那么,总和就是 2+3+2 = 7
。
目前,我通过压缩列表并使用列表推导式来实现。我的列表为 X 和 Y:
mins = [min(x,y) for x,y in zip(X,Y)]
summed_mins = sum(mins)
这导致我的程序出现严重的运行时问题。有更快的方法吗?据我所知,列表推导是最快的。
我有两个(非常长的)列表。我想要找到每对中最小值的总和。例如,如果
X = [2,3,4]
Y = [5,4,2]
那么,总和就是 2+3+2 = 7
。
目前,我通过压缩列表并使用列表推导式来实现。我的列表为 X 和 Y:
mins = [min(x,y) for x,y in zip(X,Y)]
summed_mins = sum(mins)
这导致我的程序出现严重的运行时问题。有更快的方法吗?据我所知,列表推导是最快的。
你可以使用Python生成器和内置的map函数来避免创建列表,但这可能只会略微更快(感谢Veedrac):
summed_mins = sum(map(min, x, y))
或者你可以使用 Numpy。以下是方法:
summed_mins = np.stack((X, Y)).min(axis=0).sum()
如果您可以将输入列表直接存储为Numpy数组,这样可以更快速。
如果您甚至可以将其直接存储在二维Numpy数组中,则不需要np.stack
调用,从而使代码更快速。
如果您无法将输入直接存储/创建为Numpy数组,可以通过指定数据类型(假设您确定列表包含小整数)快速地即时创建Numpy数组。以下是一个示例:
summed_mins = np.stack((np.array(a, np.int64), np.array(b, np.int64))).min(axis=0)
sum(map(min, x, y))
- Veedracnumpy.array((x, y), dtype=object)
,Numpy 将截断为 64 位。 - Veedrac