gpt4 book ai didi

python - 为什么 shutil.rmtree() 这么慢?

转载 作者:太空狗 更新时间:2023-10-30 02:06:09 28 4
gpt4 key购买 nike

我去查看如何在 Python 中删除目录,并被引导使用 shutil.rmtree() .与我对 rm --recursive 的期望相比,它的速度让我感到惊讶。除了使用 subprocess 之外,是否有更快的替代方案?模块?

最佳答案

The implementation做了很多额外的处理:

def rmtree(path, ignore_errors=False, onerror=None):
"""Recursively delete a directory tree.

If ignore_errors is set, errors are ignored; otherwise, if onerror
is set, it is called to handle the error with arguments (func,
path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
path is the argument to that function that caused it to fail; and
exc_info is a tuple returned by sys.exc_info(). If ignore_errors
is false and onerror is None, an exception is raised.

"""
if ignore_errors:
def onerror(*args):
pass
elif onerror is None:
def onerror(*args):
raise
try:
if os.path.islink(path):
# symlinks to directories are forbidden, see bug #1669
raise OSError("Cannot call rmtree on a symbolic link")
except OSError:
onerror(os.path.islink, path, sys.exc_info())
# can't continue even if onerror hook returns
return
names = []
try:
names = os.listdir(path)
except os.error, err:
onerror(os.listdir, path, sys.exc_info())
for name in names:
fullname = os.path.join(path, name)
try:
mode = os.lstat(fullname).st_mode
except os.error:
mode = 0
if stat.S_ISDIR(mode):
rmtree(fullname, ignore_errors, onerror)
else:
try:
os.remove(fullname)
except os.error, err:
onerror(os.remove, fullname, sys.exc_info())
try:
os.rmdir(path)
except os.error:
onerror(os.rmdir, path, sys.exc_info())

注意用于创建新文件名的 os.path.join();字符串操作确实需要时间。 rm(1) 实现改为使用 unlinkat(2) 系统调用,它不执行任何额外的字符串操作。 (而且,事实上,内核不必遍历整个 namei() 只是为了找到公共(public)目录,一遍又一遍。内核的 dentry 缓存是很好也很有用,但这仍然是相当多的内核内字符串操作和比较。) rm(1) 实用程序绕过所有字符串操作,只使用文件描述符目录。

此外,rm(1)rmtree() 都会检查树中每个文件和目录的st_mode;但是 C 实现不需要将每个 struct statbuf 转换为 Python 对象,只是为了执行简单的整数掩码操作。我不知道这个过程需要多长时间,但目录树中的每个文件、目录、管道、符号链接(symbolic link)等都会发生一次。

关于python - 为什么 shutil.rmtree() 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5470939/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com