Python 如何从一大组数字中快速生成所有对的列表?
我创建了一个编号从0到131072的列表:Python 如何从一大组数字中快速生成所有对的列表?,python,python-3.x,list,combinations,Python,Python 3.x,List,Combinations,我创建了一个编号从0到131072的列表: x = [i for i in range(131072)] 然后,除编号相同的对以外的所有对: pairs = [] append_pairs = pairs.append for i in range(len(x)): for j in range(len(x)): if x[i]!=x[j]: x2 = [x[i], x[j]] append_pairs(x2) 其中:
x = [i for i in range(131072)]
然后,除编号相同的对以外的所有对:
pairs = []
append_pairs = pairs.append
for i in range(len(x)):
for j in range(len(x)):
if x[i]!=x[j]:
x2 = [x[i], x[j]]
append_pairs(x2)
其中:
pairs = [[0, 1], [0, 2], [0, 3], ... [131071, 131070]]
但是在这种语法中,它需要很长时间。可以更快吗?您可以使用
itertools.compositions
,但这可能也需要一点时间,就像这样:
import itertools as it
n = 131072
pairs = it.combinations(range(n), 2)
请注意,上面的代码不会给出所有对的列表,而是一个对上的生成器:
>>> pairs
<itertools.combinations at 0x7fb939a72a48>
使用numpy可能更快:
import numpy as np
pairs = np.transpose(np.triu_indices(n, 1))
然而,您想要生成的对的数量是巨大的,并且您无法将这些数字存储在内存中(除非您有一台非常强大的机器)。特别是,您可以获得n*(n-1)/2对对。如果将数字存储为8字节整数,则内存将略低于70GB
对于n=5000
:
- Itertools:每个回路818 ms±15.8 ms(7次运行的平均值±标准偏差,每个回路1次)
- Numpy:每个回路254 ms±30.8 ms(7次运行的平均值±标准偏差,每个回路1次)
- 原始方法:每个回路3.72 s±72.6 ms(7次运行的平均值±标准偏差,每个回路1次)
注意:因为有更多的内置代码可用,所以我生成了不同的对。从一组元素生成所有对的时间复杂度下限为O(n^2),其中n是元素数。这个下限意味着我们永远不能比O(n^2)快。
import numpy as np
pairs = np.transpose(np.triu_indices(n, 1))