我在循环中调用了一个函数,该函数返回一个包含大约50个变量的dict(dsst_mean)。所有变量都是长度为10的numpy数组。
循环迭代大约3000次。我目前正在连接到每个循环的末尾,这样我就有了一个'dsst_mean_all'字典,每次迭代都会变大。
source = [dsst_mean_all, dsst_mean]
for key in source[0]:
dsst_mean_all[key] = np.concatenate([d[key] for d in source])
它有效,但我知道这效率不高。我也有'dsst_mean_all'字典的初始化问题。 (我目前正在使用dict.fromkeys()来执行此操作。)
我的问题是:有哪些选择可以更有效地做到这一点?我想我可以将dsst_mean dicts存储在一个列表中,然后在最后连接一个。但我不确定在内存中持有3000多个numpy数组是否是一个好主意。我知道这取决于尺寸,但不幸的是现在我没有估计每个'dsst_mean'字典的大小。
感谢。
答案 0 :(得分:0)
通常我们建议在列表中收集值,并在结尾处创建一次数组。这里新的东西是我们需要迭代字典的键才能完成这个集合。
例如:
制作单个词典的功能:
stack
收藏家词典:
concatenate
迭代,收集列表中的数组:
In [810]: for k,v in dd.items():
...: dd[k]=np.stack(v,axis=0)
...:
In [811]: dd
Out[811]:
{'A': array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]]), 'B': array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]]), 'C': array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])}
字典上的另一个迭代,将列表转换为某种数组(HttpClient
,'@angular/common/http'
,您的选择):
public async saveComment() {
this._service.postComment(this.comment);
// I want to wait for the post to complete and then update my comments list below
this.comments = await this._service.getComments();
}
3000个长度为10的数组的列表将比一个30,000个数字的数组占用更多的内存,但不会大幅增加。
你可以在第一次收集一个列表中的整个词典,但你仍然需要将它们组合到这样的词典中。