【发布时间】:2017-12-01 12:58:47
【问题描述】:
假设我们有 100k 目录和 1M 文件,其结构存储在如下列表中:
DIRS = ['C:\\', 'C:\\LAB\\', 'C:\\ABB\\', 'C:\\CDA\\', 'C:\\EABZ\\', 'C:\\CDA\\FOO\\']
FILES = [['a.txt', 2], ['b.txt', 3], ['c.txt', 3], ['r.txt', 1],
['s.txt', 1], ['k.txt', 0], ['m.txt', 4]] # [filename, dir_index], for
# example, a.txt is here: C:\ABB\a.txt
现在我想搜索目录名称中包含AB的文件。我在这里看到的唯一方法如下。
-
(1)首先获取
DIRS的索引,其中包含AB:I = [i for i in range(len(DIRS)) if 'AB' in DIRS[i]] # here [1, 2, 4] # but can be of size 1000我们只在
DIRS上循环一次,也就是100k,没关系。 -
(2) 现在我们需要在
I(例如可以是 1000)和FILES(即 100 万)上循环,而 这太多了,因为 1000 * 1M = 10 亿次操作:FOUND_FILES = [] for i in I: for f in FILES: if f[1] == i: FOUND_FILES.append(f)
这操作太多了! 如何在保持DIRS / FILES 数据结构的同时进行更高效的研究?(如果100% 完全不可能,我应该考虑哪种其他结构?)
注意:(2)的这个替代方案并没有加快我认为的任何事情:
for f in FILES: # we loop over 1M items
if f[1] in I: # to test if f[1] is contained in I, we might loop over 1000 items too
FOUND_FILES.append(f)
【问题讨论】:
标签: python list loops optimization filesystems