【问题标题】:How to efficiently handle large list in Python3? [duplicate]如何有效地处理 Python3 中的大列表? [复制]
【发布时间】:2019-07-30 18:26:53
【问题描述】:

我接到了一项奇怪的任务,要从 33 种不同的产品中找出一种产品组合,以达到一定的总销售额。可能的组合显然是 2^33。当我使用下面的代码时,它显示“内存错误”。我的win10桌面装了64G内存。好消息是我使用 Excel VBA 解决了这个问题,花了几个小时才得到结果。有没有人有想法来处理这类问题?使用发电机?还是 PD 数据帧?谢谢!

import numpy as np
import itertools, sys

a1 = [4435.48, 327.96, 23.26, 4136.78, 77.06, 158.73, 1389.34,
  820.32, 888.33, 3735.7, 201.78, 31.17, 250.04, 87.17, 3230.95,
  491.53, 47.11, 508.22, 52.22, 1255.98, 3755.11, 948.4, 905.44,
  80.41, 1323.68, 528.57, 1474.4, 83.98, 756.87, 310.68, 27.86,]
n = len(a1)
lst = [list(i) for i in itertools.product([0, 1], repeat=n)]

for g in lst:
    c = sum(np.multiply(g, a1))
    if abs(c - 11833) < 1:
        print (g)
        sys.exit()

【问题讨论】:

  • itertools.product is 一个迭代器 - 问题是你将它包装在一个列表理解中。反复使用它,你不应该遇到内存问题。
  • 您有change-making problem 的变体,并且解决方案不需要暴力破解所有组合。
  • @juanpa.arrivillaga - 非常正确 - 正好赶上我编辑 :)
  • 谢谢各位!我对 Python 非常陌生。 “迭代地使用它”你能详细说明一下吗? @match。
  • @LarryZ 不要从你的product 迭代器中实现一个列表,即你做了lst = [list(i) for i in itertools.product([0, 1], repeat=n)]不需要一个列表,你想迭代迭代器中的值。从字面上用lst = itertools.product([0, 1], repeat=n) 替换该行,并且可能选择lst 以外的其他名称,因为它不是一个列表。

标签: python python-3.x list


【解决方案1】:

内存意味着您的内存不足。您可以通过import sys; print(sys.maxsize)import struct; print(struct.calcsize("P")*8) 查看。 后者是检查 32 位还是 64 位。

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多