Python shutil.rmtree调用需要很长时间

问题描述 投票:1回答:2

我目前有一个Python程序调用shutil.rmtree完成删除大量执行时创建的文件。此呼叫大约需要20 +秒。我使用cProfile对此进行了分析,几乎所有这些时间都用在posix.remove调用上。

如果我不删除这些文件作为Python程序的一部分,而是在程序执行完毕后在文件夹上调用rm -rf,则rm -rf将在<5秒内执行。

有什么特别的东西可能导致执行时间的巨大差异?

python unix
2个回答
0
投票

看看source for rmtree,除了最少量的本机代码外,它还有很多python代码。其中很多也是字符串处理,它会产生几个小的短暂对象。我现在没有方便的配置文件,但我的猜测是,大部分时间花在in the loop body of _rmtree_safe_fd上。


0
投票

shutil.rmtree在它遍历的每个文件条目上对os.stat进行系统调用,以确定它是文件还是目录,这是浪费大量时间,因为在列出目录时已经获得了该信息。

这些信息是os.walk函数利用的(有关详细信息,请参阅PEP-471),您可以使用它自己实现rmtree

import os
def rmtree(directory):
    for root, dirs, files in os.walk(directory, topdown=False):
        for file in files:
            os.remove(os.path.join(root, file))
        for dir in dirs:
            os.rmdir(os.path.join(root, dir))
    os.rmdir(directory)
© www.soinside.com 2019 - 2024. All rights reserved.