【发布时间】:2014-12-02 00:21:17
【问题描述】:
我正在使用一个非常大的二维方形数组,其条目是整数列表。这不是一成不变的,而是说它是一个 w x w 数组,其中 w=15000,每个条目是一个整数列表,随机大小从 0 到 400。 这有两个特点:
- 是对称的
- 它的许多条目是空列表,包括对角线上的那些
现在,我只是利用第一部分并像下面的伪代码一样实现它:
F=[ [ [] for i in range(w)] for j in range(w) ] # Initiate a blank w X w array
for i in range(w):
for j in range(i):
If (condition):
F[i][j] = [A list of integers]
最后,我将其余的值分配如下:
for i in range(w):
for j in range(w):
F[i][j]=F[i][j] # Reference, thus size of F does not increase much
我不是经验丰富的程序员,我觉得这种方法可能效率不高。特别是,我觉得我没有利用许多条目为空的事实。
我可以有一个更有效的列表 F 以便它不会为最终为空的条目占用任何空间吗?
请注意,正确分配“坐标”x、y 仍然很重要。
【问题讨论】:
-
numpy 中的稀疏数组可能吗?
-
有许多不同的“稀疏数组”数据结构,它们有不同的权衡。您将不得不做一些研究,因为一般来说没有人能告诉您哪个是“最好的”。
-
同时,如果你从原生 Python 列表切换到 NumPy 数组,你可以使用
scipy.sparse来处理大多数在 Python 中编写起来很笨重的数据结构。 -
你知道它可能有多稀疏吗?如果 50% 的条目平均长度为 200 项,则实际数据很大(112.5 亿个值),而空的和对称的条目上“浪费”的空间与总数相比非常小。所以也许你还不如坚持你所拥有的。如果它的占用率为 0.01%,那么字典或自定义“稀疏矩阵”数据结构更有可能产生实际影响。如果它 99.75% 被占用,而只有 0.25% 的条目是空的,那就别再为它们节省空间了。
-
@geo909:这里要考虑的另一件事是,平均长度为 200 的 225M Python 列表没什么好打喷嚏的。使用 15K*15K*400 的 NumPy 数组可能会比通过将第三维固定为 400 而不是让它在 0-400 之间变化而浪费的时间和/或空间节省更多。另外,你的整数范围是多少? 11.25G
int32对象的大小是 11.25G 8 字节指针大小的一半,即使它们都是 0,如果它们均匀分布,您还可以节省多达 4G 24 字节int对象。
标签: python arrays list size memory-efficient