【发布时间】:2013-07-06 00:59:05
【问题描述】:
import numpy as np
前言:
如果您已经知道这一点,如果您觉得无聊,请跳过前言。
我最近在调试时遇到了一个问题。我写了 `A = B = C = np.zeros([3,3]) 我以为我刚刚定义了三个新矩阵。我所做的实际上是不同的。我定义了一个新矩阵(用零填充)和三个标签,每个标签都指向同一个矩阵。让我用下面的例子来说明:
>>> a = b = [0,0]
>>> a
[0,0]
>>> b
[0,0]
>>> # All good so far.
>>> a[0] = 1
>>> a
[1,0]
>>> # Nothing short of what one would expect...
>>> b
[1,0]
>>> # ... but since 'b' is assigned tot he same tuple, it changes as well.
问题:
嗯。现在我知道这没问题了,对吧?当然我可以写:
A = np.zeros([3,3])
B = np.zeros([3,3])
C = np.zeros([3,3])
一切正常吗?没错,但我同样可以写:
A, B, C = np.zeros([3,3,3])
我认为第二个选项以更有效的方式使用内存,因为它定义了一个 3x3x3 张量,然后为每个层定义了 3 个标签 A、B 和 C,而不是三个单独的矩阵,它们之间可能存在内存位。
你觉得哪个更好?
【问题讨论】:
-
不幸的是,这可能会被关闭,因为它不是 SO 的正确格式。 .. 但只需运行 timeit 并查看您的 procmon 以查看两者的内存和时间足迹......人们认为完全无关紧要,您自己检查指标很容易
-
如果您希望将 3D 数组用于某事(例如计算所有 3 个矩阵的元素平均值),通常只进行解包操作,这当然需要给它一个标签:@ 987654325@。这主要是个人喜好问题,尽管如果您的阵列非常大,那么找到三个三分之一大小的插槽可能比一个完整大小的插槽更容易。
标签: python memory memory-management numpy matrix