两个列表之间的最小对数,有没有更快的方法?
Minimum of pairs between two lists, is there a quicker way?
我有两个(很长的)列表。我想找到列表中每对的最小值之和。例如,如果
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 数组,则速度会快得多。
如果您甚至可以将它直接存储在 2D Numpy 数组中,则不需要 np.stack
调用,从而使代码更快。
如果您不能 store/create 直接将输入作为 Numpy 数组,您可以通过指定数据类型快速创建 Numpy 数组(假设您确定列表包含小整数)。这是一个例子:
summed_mins = np.stack((np.array(a, np.int64), np.array(b, np.int64))).min(axis=0)
我有两个(很长的)列表。我想找到列表中每对的最小值之和。例如,如果
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 数组,则速度会快得多。
如果您甚至可以将它直接存储在 2D Numpy 数组中,则不需要 np.stack
调用,从而使代码更快。
如果您不能 store/create 直接将输入作为 Numpy 数组,您可以通过指定数据类型快速创建 Numpy 数组(假设您确定列表包含小整数)。这是一个例子:
summed_mins = np.stack((np.array(a, np.int64), np.array(b, np.int64))).min(axis=0)