【发布时间】:2011-03-10 20:56:58
【问题描述】:
我正在尝试提高 elfinder 的性能,这是一个基于 ajax 的文件管理器 (elRTE.ru)。
它在递归中使用 os.listdir 以递归方式遍历所有目录并影响性能(例如列出包含 3000 + 个文件的目录需要 7 秒)..
我正在努力提高它的性能,这是它的步行功能:
for d in os.listdir(path):
pd = os.path.join(path, d)
if os.path.isdir(pd) and not os.path.islink(pd) and self.__isAccepted(d):
tree['dirs'].append(self.__tree(pd))
我的问题是:
- 如果我更改 os.walk 而不是 os.listdir ,会提高性能吗?
- 使用 dircache.listdir() 怎么样?在初始请求时缓存整个目录/子目录内容并返回缓存结果,如果没有上传新文件或文件没有更改?
- 还有其他更快的目录遍历方法吗?
- 任何其他用python快速编写的服务器端文件浏览器(但我更喜欢让这个更快)?
【问题讨论】:
-
您将这些数据用于什么目的?如果你有能力懒惰地进行递归(仅在需要内容时调用
os.listdir(),而不是在找到新目录时自动调用),那么你可以分摊大量请求的成本。这就是大多数文件管理器在实践中的工作方式。 -
此数据用于基于 ajax 的文件管理器,名为 elfinder,来自 elrte.ru。它很好,但由于我粘贴的功能,问题太慢了。你的看起来很实用,我会把它改成寻找每个目录而不是整个递归。
-
os.walk()不会比您的步行功能更快,因为它们的功能基本相同。os.walk()使用os.listdir()、os.pathisdir()等。查看os.walk()的代码就知道了! -
2017 年更新:现在这里很多信息已经过时了。即
os.walk不再使用listdir,现在它使用更快的scandir。 -
@wim 它开始使用哪个版本?在 2.7 中不可用吗?
标签: python file-io directory performance