我一直在处理一个需要创建大型目录结构的项目。我的第一个解决方案是保留所有目录的字典,如果遇到尚未创建的目录,则使用os.makedirs()创建它及任何缺失的中间目录。
当我对这段代码进行剖析时,我发现绝大部分时间(132秒中的105秒)都用于调用posix.stat()来确定中间目录不存在。然而,我是在一个空目录中构建整个结构,因此我已经知道没有任何中间目录存在。
为了利用这一点,我编写了代码的另一个版本,它保留了一个内部备忘录,描述了目录树的结构,以便可以确定已创建哪些目录,而无需查询os:
为了利用这一点,我编写了代码的另一个版本,它保留了一个内部备忘录,描述了目录树的结构,以便可以确定已创建哪些目录,而无需查询os:
class DirTree:
def __init__(self, root):
self.root = os.path.abspath(root)
self.tree = {}
def makedirs(self, path):
relpath = os.path.relpath(path, self.root).replace('\\', '/')
built = self.root
node = self.tree
for directory in relpath.split('/'):
built = os.path.join(built, directory)
if directory in node:
node = node[directory]
else:
node[directory] = {}
node = node[directory]
os.mkdir(built, 0777)
这段代码的运行速度确实更快,但是当我通过分析器运行它时,相同的4068次os.mkdir()调用现在需要4倍的时间(94秒而不是24秒)。我不明白为什么当从我的函数中调用该函数时,它需要更长的时间,而当由os.makedirs()调用时,它却不需要。有人知道为什么吗?
makedirs()
中的if head and tail and not path.exists(head):
执行了stat()
调用。 - glglgl