【发布时间】: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 可以达到数百万的数量级。
【问题讨论】:
-
您已经将表达式定义为有效的生成器,如果您不想分配所有项目的列表,只需删除方括号即可。
sum和zip都接受生成器表达式作为参数。 -
@HymnsForDisco 我会留下这个问题 XD 有人会觉得这很有用
标签: python optimization memory