为什么 os.scandir() 和 os.listdir() 一样慢?

2023-11-22

我尝试在 Windows 上使用 os.scandir() 而不是 os.listdir() 来优化用 Python 编写的文件浏览功能。然而时间没有变化,大概是2分半钟左右,我也说不上来为什么。 以下是原始和更改后的功能:

os.listdir() 版本:

def browse(self, path, tree):
    # for each entry in the path
    for entry in os.listdir(path):
        entity_path = os.path.join(path, entry)
        # check if support by git or not
        if self.git_ignore(entity_path) is False:
            # if is a dir create a new level in the tree
            if os.path.isdir( entity_path ):
                tree[entry] = Folder(entry)
                self.browse(entity_path, tree[entry])
            # if is a file add it to the tree
            if os.path.isfile(entity_path):
                tree[entry] = File(entity_path)

os.scandir() 版本:

def browse(self, path, tree):
    # for each entry in the path
    for dirEntry in os.scandir(path):
        entry_path = dirEntry.name
        entity_path = dirEntry.path
        # check if support by git or not
        if self.git_ignore(entity_path) is False:
            # if is a dir create a new level in the tree
            if dirEntry.is_dir(follow_symlinks=True):
                tree[entry_path] = Folder(entity_path)
                self.browse(entity_path, tree[entry_path])
            # if is a file add it to the tree
            if dirEntry.is_file(follow_symlinks=True):
                tree[entry_path] = File(entity_path)

此外,以下是该函数中使用的辅助函数:

def git_ignore(self, filepath):
    if '.git' in filepath:
        return True
    if '.ci' in filepath:
        return True
    if '.delivery' in filepath:
        return True
    child = subprocess.Popen(['git', 'check-ignore', str(filepath)],
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)
    output = child.communicate()[0]
    status = child.wait()
    return status == 0

============================================================

class Folder(dict):
    def __init__(self, path):
        self.path = path
        self.categories = {}

============================================================

class File(object):
    def __init__(self, path):
        self.path = path
        self.filename, self.extension = os.path.splitext(self.path)

有人有办法让我的函数运行得更快吗?我的假设是,在开始时提取名称和路径会使其运行速度比应有的速度慢,这是正确的吗?


关于你的问题:

os.walk 似乎调用 stats 的次数超过了必要的次数。这似乎就是它比 os.scandir() 慢的原因。

在这种情况下,我认为提高速度性能的最佳方法是 使用并行处理,这可以在某些循环中极大地提高速度。 有多个帖子讨论过这个问题。这里有一个:Python 中的并行处理 – 带有示例的实用指南.


尽管如此,我还是想分享一些对此的想法。

我也一直想知道有哪些最佳用法这三个选项(scandir、listdir、walk)。关于性能比较的文档并不多。最好的方法可能是像您一样自己测试一下。这是我对此的结论:

os.listdir() 的用法:

与 os.scandir() 相比,它似乎没有优势,只是更容易理解。当我只需要列出目录中的文件时,我仍然使用它。

PROS:

  • 快速简单

CONS:

  • 太简单了,仅适用于列出目录中的文件和目录,因此您可能需要将其与其他方法结合起来以获得有关文件元数据的额外功能。如果是这样,最好使用 os.scandir()。

os.walk() 的用法:

当我们需要获取目录(和子目录)中的所有项目时,这是最常用的函数。

PROS:

  • 这可能是遍历所有项目路径和名称的最简单方法。

CONS:

  • 似乎调用统计数据的次数超过了必要的次数。这似乎就是它比 os.scandir() 慢的原因。
  • 虽然它为您提供了文件的根部分,但它不提供 os.scandir() 的额外元信息。

os.scandir() 的用法:

它似乎(几乎)两全其美。它给你简单的速度操作系统列表目录具有额外的功能,可以让您 简化循环,因为您可以避免使用 exiftool 或其他元数据工具 当您需要有关文件的额外信息时。

PROS:

  • 快速地。与 os.listdir() 速度相同
  • 非常好的附加功能。

CONS:

  • 如果您想深入子文件,您需要创建另一个函数来扫描每个子目录。这个函数非常简单,但在这种情况下使用 os.walk 可能会更Pythonic(我只是指更优雅的语法)。

这就是我阅读并使用它们后的观点。我很高兴得到纠正,这样我就可以了解更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 os.scandir() 和 os.listdir() 一样慢? 的相关文章

随机推荐

  • pip freeze 列出已卸载的软件包

    在 OS X 10 6 8 上 我使用卸载了一个包 至少 pip 告诉我是这样 sudo pip uninstall pkg name 但当我这样做时包裹仍然出现 pip freeze 我再次尝试执行上面的卸载命令 pip 告诉我该软件包尚
  • 将输入文件替换为表单中我自己的按钮

    基本上我想隐藏输入文件并使用按钮来选择表单中的文件 如果我使用
  • onchange 事件是否传播?

    我使用事件委托来侦听 DOM 中较低层的事件 但它不适用于选择框上的 onchange 事件 onchange 事件是在 DOM 中传播还是冒泡 谷歌搜索未能找到确凿的答案 根据规格 change submit reset应该起泡并且foc
  • 查询Android数据库是否存在!

    我已经为我的 android 应用程序创建了一个数据库 其中包含静态数据并且不需要更新 删除功能 因此当应用程序启动时 我想检查数据库是否存在 如果不存在则执行我的 dbAdapter 类 我知道它是一个简单的 if 语句 但我只是想知道查
  • 您建议使用哪个 CPAN 模块将 HTML 转换为纯文本?

    您建议使用哪个 CPAN 模块将 HTML 转换为格式化纯文本 一项严格的要求是该模块必须处理 Unicode 字符 I like HTML 格式文本 and HTML FormatText WithLinks
  • Angular 2 - 如何为动态加载的组件设置 id 属性

    我在用DynamicComponentLoader加载子组件并生成以下 html
  • 在 std::map 和 std::unordered_map 之间进行选择[重复]

    这个问题在这里已经有答案了 现在std有一个真正的哈希映射unordered map 为什么 或何时 我仍然想使用旧的map over unordered map在它实际存在的系统上 是否有任何我无法立即看到的明显情况 As 已经提到过 m
  • R tm removeWords函数不删除单词

    我试图从我构建的语料库中删除一些单词 但它似乎不起作用 我首先遍历所有内容并创建一个数据框 按频率顺序列出我的单词 我使用此列表来识别我不感兴趣的单词 然后尝试创建一个删除单词的新列表 但是 这些词仍然保留在我的数据集中 我想知道我做错了什
  • 在 JAVA 中使用 JSOUP 从 HTML 中提取 CSS 样式

    任何人都可以帮助使用 Java 中的 Jsoup 从 HTML 中提取 CSS 样式 例如在下面的 html 中我想提取 ft00 和 ft01 div style width 931 height 1243 div
  • WPF:滚动项目控制内容固定标题

    是否可以使用 WPF 的 ItemsControl 执行类似的操作 Demo 我正在尝试冻结 GroupedItems 而不是 GridView 列 资源
  • 如何获取小部件当前的 x 和 y 坐标?

    我目前正在编写一个关于游戏 4 in a row 的游戏项目 为了制作图片小部件磁盘落在列中的动画 我一直在考虑创建一个 while 循环 如下所示 while widgetx and widgety 在空白部分将有我需要获得的值 我的问题
  • WebRTC 永远不会在 IceCandidate 上触发

    我开始使用 WebRTC 进行开发 但那东西从来没有给我提供 ICE 候选人 我设置了一切 我正在交换描述和东西 我还在那里缩小了一个超级丑陋的功能 以确保一切都正确运行 一个接一个 两者的信令状态都是稳定的 onError从未被触发 如预
  • Git:从存储库自动拉取?

    有没有什么方法可以设置 git 使其侦听来自远程存储库的更新 并在发生变化时拉取 用例是我想使用 git 部署一个 Web 应用程序 这样我就可以对已部署的应用程序进行版本控制 但想将 中央 git 存储库放在 Github 上而不是 We
  • 将 int 转换为 16 位无符号短整型

    我想在 Python 中将整数修剪为 16 位字 无符号短整型 像下面这样的东西不起作用 word array H word insert 0 0x19c6acc6 Use ctypes c ushort gt gt gt import c
  • 为什么 Android 教程中的大多数字段(类成员)都以“m”开头?

    我知道驼峰规则 但我对这个 m 规则感到困惑 它代表什么 我是一名 PHP 开发人员 我们 使用变量的首字母作为类型指示 例如 b 代表布尔值 i 代表整数等等 m 是 Java 的东西吗 它代表移动吗 混合 该表示法来自 AOSP And
  • 如何迭代 PriorityQueue?

    for Event e pq 不按优先级顺序迭代 while pq isEmpty Event e pq poll 这有效但清空了队列 你不能遍历一个Priority Queue由于底层实现的原因 我认为它是Java中的最小堆 因此按该顺序
  • GCC 中函数静态变量是线程安全的吗?

    在示例代码中 void foo static Bar b 编译为GCC是否保证b将以线程安全的方式创建和初始化 在 gcc 的手册页中 找到了 fno 线程安全 静态命令行选项 不要发出额外的代码来使用 C ABI 中指定的例程 本地线程安
  • php:无法修改函数中的数组?

    所以我尝试通过在函数中添加键和值来修改数组modArr 我希望 var 转储显示添加的项目 但我得到 NULL 我在这里缺少哪一步
  • 错误:gpu_process_transport_factory.cc(1007) - 丢失 UI 共享上下文:在无头模式下通过 ChromeDriver 初始化 Chrome 浏览器时

    当我尝试在 3 台计算机中的 2 台上运行代码时 出现此错误 0502 155335 565 ERROR gpu process transport factory cc 1007 Lost UI shared context 这是代码 f
  • 为什么 os.scandir() 和 os.listdir() 一样慢?

    我尝试在 Windows 上使用 os scandir 而不是 os listdir 来优化用 Python 编写的文件浏览功能 然而时间没有变化 大概是2分半钟左右 我也说不上来为什么 以下是原始和更改后的功能 os listdir 版本