两个列表中的最小值对,有更快的方法吗?

3

我有两个(非常长的)列表。我想要找到每对中最小值的总和。例如,如果

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)

这导致我的程序出现严重的运行时问题。有更快的方法吗?据我所知,列表推导是最快的。


你的代码看起来运行良好,没有任何错误。 - Rima
1个回答

3

你可以使用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)

1
sum(map(min, x, y)) - Veedrac
1
请注意,如果您不使用numpy.array((x, y), dtype=object),Numpy 将截断为 64 位。 - Veedrac
1
我看到你也是Python性能的粉丝,可惜这种语言的并行性方面不太好。 - dreamcrash
1
@dreamcrash 是的,我完全同意,但现有代码仍有很大的改进空间。有时仅通过使用Numpy/Numba和一些算法修复就可以将代码加速100~1000倍,这真是太神奇了 ;) 。 - Jérôme Richard
1
@JérômeRichard 我能理解你的感受 :) 当你使用 GPU 时,往往会遇到很多这样的错误,但通常这意味着原始代码不够好,因此可以进行优化。 - dreamcrash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接