Python"内存错误。" /节省记忆

时间:2016-12-26 07:18:20

标签: python performance memory

我制作了一个程序,该程序采用数字列表并输出"三元组。" 三元组由x / y / z表示,x> = y> = z

出于某种原因,在执行我的代码时,我得到了一个"内存错误。"我不确定为什么会这样或者如何解决它。我只能假设它与错误地管理内存或使我的程序更有效率有关。

这很冗长,但我不能留下任何东西,因为我不知道问题是什么。

所以有两个问题......我如何解决这个"内存错误。"我怎样才能使这个程序更有效率? (它的速度非常慢。)

节目输出: [[6,3,1],[6,2,2],[6,2,1],[6,1,1],[5,1,1],[4,2,2],[ 4,2,1],[4,1,1],[3,1,1],[2,2,1],[2,1,1]] 11

l = [1,1,2,2,3,4,5,6]

def answer(l):
    l.sort()
    l.reverse()
    triples = []
    final = []
    for first_main_counter in range(len(l)):
        main_testing_number = l[first_main_counter]
        divisors = []
        divisors = [x for x in l if main_testing_number % x == 0]
        del divisors[0]
        for second_main_counter in range(len(divisors)):
            second_main_testing_number = divisors[second_main_counter]
            divisors2 = []
            divisors2 = [x for x in divisors if second_main_testing_number % x == 0]
            del divisors2[0]
            for x in range(len(divisors2)):
                triples.append([l[first_main_counter],divisors[second_main_counter],divisors2[x]])

    seen = set()
    for item in triples:
        t = tuple(item)
        if t not in seen:
            final.append(item)
            seen.add(t)
    print(final)
    print(len(final))


answer(l)

1 个答案:

答案 0 :(得分:3)

如果我理解正确,你可以做得那么多,更简单:

>>> {(x, y, z) for x, y, z in itertools.combinations(l, 3) if z % y == 0 and y % x == 0}
 {(1, 1, 2),
 (1, 1, 3),
 (1, 1, 4),
 (1, 1, 5),
 (1, 1, 6),
 (1, 2, 2),
 (1, 2, 4),
 (1, 2, 6),
 (1, 3, 6),
 (2, 2, 4),
 (2, 2, 6)}

就是这样。只要您的列表已排序,itertools.combinations将仅按升序返回三元组。 (如果你的列表没有排序,只需先排序。如果你想按顺序排序,反向排序并切换可分性检查的方向。)你不需要做所有费力的除数检查你'干嘛。只需检查每个组合,看看它是否满足“x divides y”和“y divides z”。

如果您更关心速度,这里的版本速度可与原版相媲美,但更具可读性:

def anotherWay(stuff):
    result = set()
    for ix, x in enumerate(stuff):
        for iy, y in enumerate(stuff[ix+1:], ix+1):
            if y % x:
                continue
            for z in stuff[iy+1:]:
                if z % y:
                    continue
                result.add((x, y, z))
    return result

(这再次假定列表以升序顺序,并返回z >= y >= x的结果,这是您在问题中要求的结果,而不是您的代码实际执行的内容。)