我在内存中存储/缓存文件系统(仅限文件名),以便能够快速研究àlaEverything 。因此,我不想使用操作系统的内置文件搜索GUI。
我这样做:
import os
L = []
for root,dirs,files in os.walk(PATH):
L.append([root, files])
结果是这样的:
[['D:\\', ['a.jpg', 'b.jpg']],
...
['D:\\Temp12', ['test.txt', 'test2.txt']]]
问题在于,当L
包含数百万个元素时,进行研究需要花费太多时间:
query = 'test2' #searching for filename containg this text
for dir in L:
for f in dir[1]:
if query in f:
print '%s found: %s' % (query, os.path.join(dir[0],f))
事实上,这是一个非常天真的搜索,因为它需要浏览整个列表才能找到项目。
如何更快地进行查询?
似乎列表不是进行全文研究的正确数据结构,是否存在树状结构?
答案 0 :(得分:0)
列表中的研究是O(n),字典研究是摊销O(1)。如果您不需要关联值,请使用集合。
如果您想了解更多信息:https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
在你的情况下,我会使用集合。它会使您的查询更快。
编辑:
你这样做,检查每个文件的匹配不会那么快。即使您使用dict,也可以检查匹配的每个文件名。
新想法: 您可以创建一个dict,其中所有文件名都作为键,root作为每个的值。这样,您可以稍后重新创建完整路径。
现在的想法是创建一个树,每个节点都是一个字母,并且每个节点之间的路径都是单词(filename)。它可能很难实现,结果可能不会更快,具体取决于构造树的方式。
您必须记住,您要检查每个文件名并使用列表或词典不会改变它。树/图是我能想到的唯一解决方案。
答案 1 :(得分:0)
你能考虑为此使用数据库吗?
SQLite提供:memory:选项,它仅在内存中创建数据库。当然,您可以像其他答案和评论中所指出的那样优化您的算法和数据结构,但数据库通常已经非常擅长于它们的索引,并且您不需要设计类似的东西。
您的表可以只是一个包含字段full_path和filename的表,如果您按文件名对其进行索引,则表示速度很快。这会存储大量冗余信息,因为每个文件都有full_path中的完整路径。一个更好的解决方案是为目录创建一个表,为文件创建另一个表,并且您只需从文件中引用目录以获得匹配的完整路径。
只是一个想法。
哈努哈利