目录行走的速度更快,而不是os.listdir?

Phy*_*win 16 python directory performance file-io

我正在努力提高elfinder的性能,这是一个基于ajax的文件管理器(elRTE.ru).

它在一个recurisve中使用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))
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 如果我改变os.walk而不是os.listdir,它会改善性能吗?
  2. 如何使用dircache.listdir()?在初始请求时缓存WHOLE目录/ subdir内容并返回缓存结果,如果没有上传新文件或文件没有更改?
  3. 目录行走的其他方法有哪些更快?
  4. 任何其他服务器端文件浏览器,用python快速编写(但我更喜欢快速编写这个)?

gar*_*on4 20

我只想弄清楚如何在一个较大的文件系统上加速os.walk(350,000个文件分布在大约50,000个目录中).我在linux盒子上使用ext3文件系统.我发现有一种方法可以加快我的速度.

具体来说,使用自上而下的漫游,每当os.walk返回多个目录的列表时,我使用os.stat获取每个目录的inode编号,并按inode编号对目录列表进行排序.这使得walk主要以inode顺序访问子目录,这减少了磁盘搜索.

对于我的用例,它加快了我的完整目录步行,从18分钟到13分钟......

  • garlon4 好把戏,如果没有你的提示,很难这样想。@V3ss0n,我认为如果您愿意,您仍然可以随时更改您选择的答案。 (2认同)

gab*_*ous 11

你看过scandir(以前更好的行走)吗?没有亲自尝试,但这里有一个讨论,另一个在这里讨论.它声称在MacOSX/Linux上加速3~10x,在Windows上加速7~50x,避免了对os.stat()的冗余调用.它现在也包含在Python 3.5的标准库中.

Python的内置os.walk()比它需要的速度慢得多,因为 - 除了在每个目录上调用listdir()之外 - 它还调用每个文件上的stat()来确定文件名是目录还是不.但是Windows上的FindFirstFile/FindNextFile和Linux/OS X上的readdir都已经告诉您返回的文件是否是目录,因此不需要进一步的统计系统调用.简而言之,您可以将系统调用的数量从大约2N减少到N,其中N是树中文件和目录的总数.

在实践中,删除所有这些额外的系统调用使得os.walk()在Windows上快7到50倍,在Linux和Mac OS X上快3到10倍.

项目的自述文件.

  • **注意**:`scandir`现在包含在Python中,[**它实际上被**`os.walk`使用](https://github.com/python/cpython/blob/cb41b2766de646435743b6af7dd152751b54e73f/Lib/ os.py#L348).因此,如果您正在考虑将"scandir"作为更快的替代品,那么您可以忘记这一点! (5认同)
  • `scandir`包含在Python 3.5的`os`模块中. (3认同)

Ale*_*lli 5

您应该直接测量您特定兴趣的计算机(操作系统,文件系统和缓存等) - 无论是否os.walkos.listdir特定和完全不同的计算机更快/ OS/FS会告诉您关于您的性能的很少.

不确定你的意思cachedir.listdir- 没有该名称的标准库模块/功能.listdir已经读取了一个gulp中的所有目录(因为它必须对结果进行排序),os.walk因为它必须将子目录与文件分开.如果,根据您的平台,您可以快速获得有关文件/目录更改的通知,那么可能需要构建一次树并在更改通知发生时逐步编辑它...但这取决于更改的相对频率vs请求,这又完全取决于您的具体应用环境.

  • @ V3ss0n,`dircache`从来没有特别好用,自从Python 2.6以来最终被弃用并从Python 3.0开始被删除 - 我绝对不会建议它. (2认同)