【问题标题】:Python sum over iterator to avoid memory issuesPython sum over iterator 以避免内存问题
【发布时间】:2020-03-28 20:29:19
【问题描述】:

假设我有几个这样的列表:

num = 100
configs = np.random.randint(0, 5, size=(num, 8))
probs = np.random.rand(num)

现在,我使用 qutip 用from qutip import tensor, basis 做一个热编码和张量产品。这里basis(N,i) 将整数i<N 编码为N 个类的一种热编码,即basis(3, 0) = [1, 0, 0]basis(4,2) = [0, 0, 1, 0]。现在,张量做 Kronecker 乘积,就像np.kron,但可以接收多个参数并在参数列表上迭代地执行np.kron。现在我执行以下操作:

states = [tensor(*[basis(5, i) for i in config]) for config in configs]

这可能会占用大量内存,因此更好的选择是将其定义为生成器。现在,我需要计算这个总和:

sum([p*state for p, state in zip(probs, states)])

我想在不消耗内存的情况下进行此求和,即 zip 一次应该只消耗一个概率元素和一个状态元素。然后,应该一次对一对元素进行求和,以保持较低的内存使用率。我想尽可能快地做到这一点,并尽可能少地消耗内存。 num 可以达到数百万的数量级。

【问题讨论】:

  • 您已经将表达式定义为有效的生成器,如果您不想分配所有项目的列表,只需删除方括号即可。 sumzip 都接受生成器表达式作为参数。
  • @HymnsForDisco 我会留下这个问题 XD 有人会觉得这很有用

标签: python optimization memory


【解决方案1】:

由于 sum 和 zip 接收生成器,只需将方括号更改为常规括号即可定义生成器而不是列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2014-08-26
    • 2019-05-11
    • 2018-10-07
    相关资源
    最近更新 更多