Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 处理列表中的90万项”;“迅速”;何时需要多次访问它?_Python_Python 3.x_List_Optimization_Large Data - Fatal编程技术网

Python 处理列表中的90万项”;“迅速”;何时需要多次访问它?

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

我有一个用例,在这个用例中,我将“链接”拉入服务器文件共享上的文件

然后,我需要对这些链接运行一些正则表达式检查,并将它们分解为特定的部分,以便对它们进行排序

一旦排序,我需要在x个服务器之间拆分列表,以开始提取它们。排序很重要,因为每个分割都需要均匀

 ['/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)