避免迭代太多时间-算法构造



我有一个列表memory_per_instance,它看起来如下:

[
{
'mem_used': '14868480', 
'rsrc_name': 'node-5b5cf484-g582f'
},
{
'mem_used': '106618880',
'rsrc_name': 'infrastructure-656cf59bbb-xc6bb'
},
{
'mem_used': '27566080', 
'rsrc_name': 'infrastructuret-l6fl'
},
{  
'mem_used': '215556096',
'rsrc_name': 'node-62lnc'
}
]

现在,我们可以看到有两个资源组nodeinfrastructure

我想创建一个数组,其最终乘积包含资源的名称(nodeinfrastructure(,而mem_used将是mem_used的总和。

使用regex,我已经能够区分这两组了。

从现在开始,我如何创建一个数组memory_per_group,结果是这样的

[
{
'mem_used': '230424576', 
'rsrc_name': 'node'
},
{
'mem_used': '134184960',
'rsrc_name': 'infrastructure'
},
]

我可以将rsrc的名称存储在tmp变量中,因此类似于:

memory_per_pod_group = []
for item in memory_per_pod_instance:
tmp_rsrc = item['rsrc_name']
if(item['rsrc_name'] == tmp_rsrc):
memory_per_pod_group.append({'rsrc_name':get_group(tmp_rsrc, pod_hash_map), 'mem_used':mem_used})
memory_per_pod_instance.remove(item)
pprint.pprint(memory_per_pod_group)

但是,我会在列表中重复一段不可忽略的时间。

有没有办法提高效率?

当然。你只需要一次迭代:

data = [
{
'mem_used': '14868480', 
'rsrc_name': 'node-5b5cf484-g582f'
},
{
'mem_used': '106618880',
'rsrc_name': 'infrastructure-656cf59bbb-xc6bb'
},
{
'mem_used': '27566080',
'rsrc_name': 'infrastructuret-l6fl'
},
{  
'mem_used': '215556096',
'rsrc_name': 'node-62lnc'
}
]
def get_group(item):
rsrc_name = item['rsrc_name']
index = rsrc_name.index('-');
return rsrc_name[0:index]
def summary(list):
data = {};
for item in list:
group = get_group(item)
if not (group in data):
data[group] = 0
data[group] += int(item['mem_used'])
result = []
for rsrc_name, mem_used in data.items():
result.append({ 'rsrc_name': rsrc_name, 'mem_used': str(mem_used) })
return result
if __name__ == '__main__':
print(summary(data))

结果:

[{'mem_used': 230424576, 'rsrc_name': 'node'}, {'mem_used': 106618880, 'rsrc_name': 'infrastructure'}, {'mem_used': 27566080, 'rsrc_name': 'infrastructuret'}]

注意,对于您的用例来说,get_group可能过于简单。结果有三个组,因为其中一个资源的密钥'infrastructuret'在末尾带有"t"。

您只需对其进行一次迭代,并用简单的startswitch进行检查,然后用简单的增量直接附加到您想要的字典键。

类似的东西

memory_total = { 'node': 0, 'instance': 0 };
for item in memory_per_instance:
if item['rsrc_name'].startsWith('node'):
memory_total['node'] += item['mem_used']
if item['rsrc_name'].startsWith('infrastructure'):
memory_total['instance'] += item['mem_used']

最新更新