Python 处理列表中的90万项”;“迅速”;何时需要多次访问它?
我有一个用例,在这个用例中,我将“链接”拉入服务器文件共享上的文件 然后,我需要对这些链接运行一些正则表达式检查,并将它们分解为特定的部分,以便对它们进行排序 一旦排序,我需要在x个服务器之间拆分列表,以开始提取它们。排序很重要,因为每个分割都需要均匀Python 处理列表中的90万项”;“迅速”;何时需要多次访问它?,python,python-3.x,list,optimization,large-data,Python,Python 3.x,List,Optimization,Large Data,我有一个用例,在这个用例中,我将“链接”拉入服务器文件共享上的文件 然后,我需要对这些链接运行一些正则表达式检查,并将它们分解为特定的部分,以便对它们进行排序 一旦排序,我需要在x个服务器之间拆分列表,以开始提取它们。排序很重要,因为每个分割都需要均匀 ['/local/custom_name/a_database/database_name_56_1118843/file_1.tgz'] ['/local/custom_name/a_database/database_name_56_11
['/local/custom_name/a_database/database_name_56_1118843/file_1.tgz']
['/local/custom_name/a_database/database_name_56_1118843/file_3.tgz']
['/local/custom_name/a_database/database_name_56_1118843/file_4.tgz']
['/local/custom_name/a_database/database_name_56_1118843/file_2.tgz']
['/local/custom_name/a_database/database_name_655_1118843/file_1.tgz']
['/local/custom_name/a_database/database_name_655_1118843/file_2.tgz']
['/local/custom_name/a_database/database_name_655_1118843/file_3.tgz']
['/local/custom_name/a_database/database_name_655_1118843/file_4.tgz']
['/local/custom_name_4/b_database/database_name_5242_11132428843/file_1.tgz']
['/local/custom_name_4/b_database/database_name_5242_11132428843/file_2.tgz']
['/shared/custom_name/c_database/database_name_56_1118843/file_1.tgz']
['/shared/custom_name/c_database/database_name_56_1118843/file_2.tgz']
['/local/custom_name_4/c_database/database_name_58_1118843/file_1.tgz']
['/local/custom_name/ac_database/database_name_58_1118843/file_2.tgz']
例如,因为一个_数据库中有8个文件,每个名称有4个,然后说有4个服务器,所以我需要从每个路径到每个服务器都有一个文件
我所做的是查看每个链接,然后将路径分解到字典中,其中第一个值是唯一的id:
{'uid' : 'local_custom_name_a_database_database_name_56', 'link_list': [] }
然后,在我再次浏览原始列表并添加任何适合该目录的链接之后:
{'uid' : 'local_custom_name_a_database_database_name_56', 'link_list': [
'/local/custom_name/a_database/database_name_56_1118843/file_1.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_3.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_4.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_2.tgz'
]}
然后在服务器之间拆分链接列表
所有这些都按预期工作,但是在第二部分,我将原始链接与新的字典uid进行比较,并将链接添加到列表中,这将永远花费时间。10000件需要几分钟,但90万件看起来需要125小时左右。这不好
真实的数据更复杂,而且正在进行重要的排序,但这不是瓶颈。瓶颈在描述的地方。虽然逻辑可行,但我肯定我没有以最有效的方式来做这件事
感谢您的帮助。即使只是给我指出一个更好的方法来处理本机列表和列表或dict列表之外的许多项。如果性能是一个问题,这种类型的数据结构将是一个问题。基于UID查找元素是O(n)。相反,您需要一个直接将UID映射到链接列表的字典。这允许O(1)访问。如果需要,您可以稍后转换数据 我不知道获取UID背后的确切逻辑,所以我只举了一个例子:
l = [
'/local/custom_name/a_database/database_name_56_1118843/file_1.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_3.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_4.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_2.tgz',
'/local/custom_name/a_database/database_name_655_1118843/file_1.tgz',
'/local/custom_name/a_database/database_name_655_1118843/file_2.tgz',
'/local/custom_name/a_database/database_name_655_1118843/file_3.tgz',
'/local/custom_name/a_database/database_name_655_1118843/file_4.tgz',
'/local/custom_name_4/b_database/database_name_5242_11132428843/file_1.tgz',
'/local/custom_name_4/b_database/database_name_5242_11132428843/file_2.tgz',
'/shared/custom_name/c_database/database_name_56_1118843/file_1.tgz',
'/shared/custom_name/c_database/database_name_56_1118843/file_2.tgz',
'/local/custom_name_4/c_database/database_name_58_1118843/file_1.tgz',
'/local/custom_name/ac_database/database_name_58_1118843/file_2.tgz',
]
def getUid(s):
return s[1:].rpartition("/")[0].rpartition("_")[0].replace("/", "_")
result = {}
for s in l:
result.setdefault(getUid(s), []).append(s)
print(result)
{'local_custom_name_a_database_database_name_56': ['/local/custom_name/a_database/database_name_56_1118843/file_1.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_3.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_4.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_2.tgz'],
'local_custom_name_a_database_database_name_655': ['/local/custom_name/a_database/database_name_655_1118843/file_1.tgz',
'/local/custom_name/a_database/database_name_655_1118843/file_2.tgz',
'/local/custom_name/a_database/database_name_655_1118843/file_3.tgz',
'/local/custom_name/a_database/database_name_655_1118843/file_4.tgz'],
'local_custom_name_4_b_database_database_name_5242': ['/local/custom_name_4/b_database/database_name_5242_11132428843/file_1.tgz',
'/local/custom_name_4/b_database/database_name_5242_11132428843/file_2.tgz'],
'shared_custom_name_c_database_database_name_56': ['/shared/custom_name/c_database/database_name_56_1118843/file_1.tgz',
'/shared/custom_name/c_database/database_name_56_1118843/file_2.tgz'],
'local_custom_name_4_c_database_database_name_58': ['/local/custom_name_4/c_database/database_name_58_1118843/file_1.tgz'],
'local_custom_name_ac_database_database_name_58': ['/local/custom_name/ac_database/database_name_58_1118843/file_2.tgz']}
然后,如果需要:
transformed = [{"uid": k, "link_list": v} for k, v in result.items()]
print(transformed)
[{'uid': 'local_custom_name_a_database_database_name_56',
'link_list': ['/local/custom_name/a_database/database_name_56_1118843/file_1.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_3.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_4.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_2.tgz']},
{'uid': 'local_custom_name_a_database_database_name_655',
'link_list': ['/local/custom_name/a_database/database_name_655_1118843/file_1.tgz',
'/local/custom_name/a_database/database_name_655_1118843/file_2.tgz',
'/local/custom_name/a_database/database_name_655_1118843/file_3.tgz',
'/local/custom_name/a_database/database_name_655_1118843/file_4.tgz']},
{'uid': 'local_custom_name_4_b_database_database_name_5242',
'link_list': ['/local/custom_name_4/b_database/database_name_5242_11132428843/file_1.tgz',
'/local/custom_name_4/b_database/database_name_5242_11132428843/file_2.tgz']},
{'uid': 'shared_custom_name_c_database_database_name_56',
'link_list': ['/shared/custom_name/c_database/database_name_56_1118843/file_1.tgz',
'/shared/custom_name/c_database/database_name_56_1118843/file_2.tgz']},
{'uid': 'local_custom_name_4_c_database_database_name_58',
'link_list': ['/local/custom_name_4/c_database/database_name_58_1118843/file_1.tgz']},
{'uid': 'local_custom_name_ac_database_database_name_58',
'link_list': ['/local/custom_name/ac_database/database_name_58_1118843/file_2.tgz']}]
您可以通过在O(n)时间内迭代原始列表,在一个步骤中尝试执行这两个步骤。迭代原始列表,提取uid,检查字典中是否存在uid,如果存在,则更新链接列表中的字典,否则添加键并将链接列表初始化为空。我想到了这一点,也许我错了,但我得到了项目的uid,我正在处理,并将该uid的dict添加到一个带有空链接列表的列表中,如您所述。然后在最后消除重复项。然后再次检查并将每个添加到列表中。tmp_dict_list.append(uid_dict_,带有空列表)。如果我必须在tmp_dict_列表中为d执行另一个操作,只是为了查看uid是否已经存在。。这不是很慢吗?因为tmp_dict_列表到最后将是大量的,每个人都必须迭代它以查看它是否存在。我觉得我已经在做什么了?试一下没什么坏处,我想这个解释很有道理。给我一些时间来调整这个逻辑,我会回来报告的。谢谢你的“转化”部分。还有一些其他的计算,我需要从原始的链接列表做以后,所以它很高兴能够访问那里的数据以后。原来的链接列表并不是那么简单,它实际上是一个元组列表,(link,size,in,bytes,bool1,bool2)