Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从一大组数字中快速生成所有对的列表?_Python_Python 3.x_List_Combinations - Fatal编程技术网

Python 如何从一大组数字中快速生成所有对的列表?

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) 其中:

我创建了一个编号从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)
其中:

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))