首页 > 解决方案 > 循环遍历大列表时节省内存

问题描述

我正在尝试遍历 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 上,但如果你能找到一种方法让它更快,那就太好了!

标签: python-3.xout-of-memory

解决方案


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

您可以通过使用 Johnson-Trotter 排列生成器算法(可在 Python 中获得)来改进函数 test_your_might,该算法通过一次仅交换 2 个条目来循环排列,从而减少您在所有弹珠中的循环以仅处理 2 个条目。


推荐阅读