我目前有一个Python程序调用shutil.rmtree
完成删除大量执行时创建的文件。此呼叫大约需要20 +秒。我使用cProfile对此进行了分析,几乎所有这些时间都用在posix.remove调用上。
如果我不删除这些文件作为Python程序的一部分,而是在程序执行完毕后在文件夹上调用rm -rf
,则rm -rf
将在<5秒内执行。
有什么特别的东西可能导致执行时间的巨大差异?
看看source for rmtree
,除了最少量的本机代码外,它还有很多python代码。其中很多也是字符串处理,它会产生几个小的短暂对象。我现在没有方便的配置文件,但我的猜测是,大部分时间花在in the loop body of _rmtree_safe_fd
上。
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)