优化在Python中生成和列表

时间:2018-06-06 18:53:23

标签: python optimization

我正在尝试使用Python执行以下任务:给定一组整数S,生成S + Ss1 + s2表示s1的整数集, s2成员S(不一定非同寻常)。

我使用以下代码:

def sumList(l):
    # generates a list of numbers which are sums of two elements of l
    sumL = []
    howlong = len(l)
    for i in range(howlong):
        for j in range(i+1):
            if not l[i]+l[j] in sumL:
                sumL.append(l[i]+l[j])
    return sumL

这适用于足够短的列表,但是当递交更长的列表(例如,介于0和20000之间的5000个元素)时,速度非常慢(超过20分钟)。

问题:是什么让这个慢?我的猜测是,询问总和是否已经是列表的成员需要一些时间,但我是Python和编程的相对新手,所以我不确定。我也在寻找有关如何快速完成S + S生成任务的建议。

1 个答案:

答案 0 :(得分:3)

Python有一个内置类型set,它具有非常快速的查找。您不能在一组中存储重复项或不可用的对象,但由于您需要一组整数,因此它非常适合您的需求。在下面,我还使用itertools.product来生成对。

from itertools import product

def sums(l):
    return {x+y for x, y in product(l, repeat=2)}

print(sums([1, 2, 3, 4]))
# {2, 3, 4, 5, 6, 7, 8}

至于为什么你现有的解决方案太慢,你可能想要查找术语"算法的复杂性"。基本上,它是一种根据算法扩展到许多输入的程度将算法分类为一般组的方法。您的算法是O(n^3)算法(它将进行n^3比较)。相比之下,set解决方案为O(n^2)。它通过放弃检查特定总和是否已经在set中的需要来实现这一目的。