首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用更快的方式代替os.listdir走目录?

用更快的方式代替os.listdir走目录?
EN

Stack Overflow用户
提问于 2010-07-01 22:02:45
回答 10查看 39.6K关注 0票数 23

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

它在递归中使用os.listdir递归遍历所有目录,并且性能受到影响(比如列出一个包含3000多个文件的dir需要7秒)。

我正在努力提高它的性能,因为这是它的步行功能:

代码语言:javascript
复制
        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))

我的问题是:

  1. 如果我改变os.walk而不是os.listdir,它会提高性能吗?
  2. 使用dircache.listdir()如何?在初始请求中缓存整个目录/子目录内容,如果没有新文件上载或文件中没有更改,则返回缓存结果?
  3. 还有其他更快的目录浏览方法吗?
  4. 任何其他服务器端文件浏览器都是用python快速编写的(但我更喜欢快速编写此文件)?
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-01-19 19:10:43

我只是想弄清楚如何在一个大型文件系统(35万个文件分布在大约5000个目录中)上加速os.walk。我在一个linux上,为一个ext3文件系统签名。我发现有办法让我的案子更快。

具体来说,使用自顶向下的方式,每当os.walk返回多个目录的列表时,我就使用os.stat获取每个目录的inode编号,并按inode编号对目录列表进行排序。这使得walk主要以inode顺序访问子目录,从而减少了磁盘查找。

对于我的用例,它加快了我的整个目录从18分钟到13分钟的速度.

票数 26
EN

Stack Overflow用户

发布于 2015-11-13 14:55:23

您签过斯堪迪尔 (以前是更好的步行)了吗?没有亲自尝试过,但是有一个在这里讨论它这里的另一个。它声称在MacOSX/Linux上加速了3~10倍,在Windows上加速了7~50倍,避免了对os.stat()的冗余调用。从Python3.5开始,它也包含在标准库中。

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

来自项目的自述

票数 17
EN

Stack Overflow用户

发布于 2010-07-01 22:26:10

您应该直接在您感兴趣的机器( OS、文件系统及其缓存等)上测量--无论os.walk是否比在特定和完全不同的机器/OS/ FS上的os.listdir更快,都不会告诉您在您的机器上的性能。

不清楚cachedir.listdir是什么意思--没有那个名称的标准库模块/函数。listdir已经一举读取了所有目录(因为它必须对结果进行排序),os.walk也是如此(因为它必须将子目录与文件分开)。如果根据您的平台的不同,您有一种快速的方式获得有关文件/目录更改的通知,那么可能值得构建一次树,并在更改通知出现时逐步编辑它.但这取决于更改和请求的相对频率,这也完全取决于您特定的应用程序环境。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3162002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档