python-3.x - 循环遍历大列表时节省内存
问题描述
我正在尝试遍历 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 上,但如果你能找到一种方法让它更快,那就太好了!
解决方案
不知道为什么你的内存不足。10 个弹珠在我的机器上工作;除此之外,除非存在内存泄漏,否则排列的数量可能会花费太长时间,您可以使用 Module gc 查看。
您可以通过使用 Johnson-Trotter 排列生成器算法(可在 Python 中获得)来改进函数 test_your_might,该算法通过一次仅交换 2 个条目来循环排列,从而减少您在所有弹珠中的循环以仅处理 2 个条目。
推荐阅读
- python - PythonShell 在 ElasticBeanstalk 上不起作用
- javascript - 如何向 jQuery 动画计数器添加小数?
- three.js - 如何合并文本、球体和盒子几何?
- javascript - React 应用程序在部署到 github 页面后显示空白页面
- javascript - TailwindCSS 活动链接文本颜色未更改
- c# - 错误:sequence contains no element 最近我们升级到 .NetFramework 4.7.2 t 4.8 版本
- python - 触发 Selenium 点击功能后无法获取标签文本
- r - 如何从向量中找到字符串的所有最长匹配项
- jquery - 有没有办法正确控制表单集?
- sql - 通过连接来自不同列的逗号分隔值来创建字符串