【发布时间】:2017-12-27 15:36:39
【问题描述】:
这个让我完全困惑。
asset_hist = []
for key_host, val_hist_list in am_output.asset_history.items():
for index, hist_item in enumerate(val_hist_list):
#row = collections.OrderedDict([("computer_name", key_host), ("id", index), ("hist_item", hist_item)])
row = {"computer_name": key_host, "id": index, "hist_item": hist_item}
asset_hist.append(row)
此代码与注释掉的集合行完美配合。但是,当我注释掉 row = dict 行并从集合行中删除注释时,事情变得非常奇怪。大约有 400 万行正在生成并附加到asset_hist。
因此,当我使用 row=dict 时,整个循环在大约 10 毫秒内完成,快如闪电。当我使用有序字典时,我已经等了 10 多分钟,它仍然没有完成。现在,我知道 OrderDict 应该比 dict 慢一点,但在最坏的情况下它应该慢 10 倍左右,根据我的数学计算,这个函数实际上慢了大约 100,000 倍。
我决定在最低循环中打印索引以查看发生了什么。有趣的是,我注意到控制台输出中的溅射。索引会在屏幕上快速打印,然后停止大约 3-5 秒,然后再继续。
am_output.asset_history 是一个字典,它有一个键,主机,每一行都是一个字符串列表。例如
am_output.asset_history = {"host1": ["string1", "string2", ...], "host2": ["string1", "string2", ...], ...}
编辑:使用 OrderedDict 进行溅射分析
此 VM 服务器上的总内存:仅 8GB...需要获得更多配置。
循环编号
184796(约 5 秒等待,约 60% 内存使用)
634481(约 5 秒等待,约 65% 内存使用)
1197564(约 5 秒等待,约 70% 内存使用)
1899247(约 5 秒等待,约 75% 内存使用)
2777296(约 5 秒等待,约 80% 内存使用)
3873730(LONG WAIT...等了20分钟放弃了!,内存使用率88.3%,进程还在运行)
每次运行时等待发生的位置都会发生变化。
编辑:再次运行它,这次它停在 3873333,靠近它之前停止的位置。它在形成行后停止,同时尝试追加......我没有注意到最后一次尝试,但它也在那里......问题在于追加线,而不是行线......我还在莫名其妙。这是它在长时间停止之前生成的行(将该行添加到打印语句)...更改了主机名以保护无辜者:
3873333: OrderedDict([('computer_name', 'bg-fd5612ea'), ('id', 1), ('hist_item', "sys1 Normalizer (sys1-4): 域名无法从 sys1 Name 确定'bg-fd5612ea'。")])
【问题讨论】:
-
我很难相信您所观察到的是由于
dict与OrderedDict的行为,是否有可能发生其他变化?我也认为有人会努力重现这一点 -
是的,他们需要首先生成巨大的字典,可能随机字符串生成器就足够了。但我是认真的,当我将 # 向下移动一行时,就会发生这种情况。还值得注意的是:当它在使用有序字典时卡在这个循环中并且我按 control+C 停止循环时,就像什么都没有发生......我必须按 control+Z 才能退出。
-
哪个 Python 版本?在最新版本中,OrderedDict 只是 dict 的别名,因为当前的实现恰好按实现细节排序。
-
python 3. 我在这个软件中经常使用 OrderedDicts,它们很棒......这是关于这个特定循环的东西。
-
OrderedDicts 有很多,与普通的dicts 相比并没有那么紧凑。您能否在此过程中检查您的内存使用情况?
标签: python loops ordereddictionary