循环浏览大型列表时节省内存

时间:2018-11-02 15:43:44

标签: python-3.x out-of-memory

我正在尝试遍历x!排列,而10点后我的内存不足!排列

这是代码,请帮助我清除内存

def test_your_might(NUMBER_OF_MARBLES, marbles):
    angle = 360 / NUMBER_OF_MARBLES
    angles = [angle * n for n in range(1, NUMBER_OF_MARBLES + 1)]

    Fx = []
    Fy = []

    for n in range(0, NUMBER_OF_MARBLES):
        angle = radians(angles[n])
        Fx.append(cos(angle) * marbles[n])
        Fy.append(sin(angle) * marbles[n])

    return sqrt(pow(sum(Fx), 2) + pow(sum(Fy), 2))


def brute_force_solution(NUMBER_OF_MARBLES):
    possibilities = permutations((_ for _ in range(1, NUMBER_OF_MARBLES + 1)))
    best_solution = None

    for possibility in possibilities:
        solution = test_your_might(NUMBER_OF_MARBLES, possibility)

        if best_solution is None or solution < best_solution[1]:
            best_solution = (str(possibility), solution)
    return best_solution

游戏的目的是在圆形板上平衡大理石。每个大理石的重量为n个单位。大理石1重1,2重2,依此类推。

我不认为问题出在我的test_your_might方法上,但是如果您找到一种使其更快的方法,那就太好了!

1 个答案:

答案 0 :(得分:0)

不知道为什么内存不足。我的机器上可以放10个弹珠;除此之外,除非存在内存泄漏,否则排列数量可能会花费太长时间,您可以使用Module gc查看。

您可以使用Johnson-Trotter排列生成器算法(Python中提供)来改进功能test_your_might,该算法一次仅交换2个条目即可循环排列排列,从而减少了遍历所有大理石的循环,仅处理2个条目。