【发布时间】:2014-02-21 22:17:31
【问题描述】:
我一直在从事一个必须创建大型目录结构的项目。我的第一个解决方案是保留所有存在的目录的字典,如果遇到尚未制作的目录,请使用 os.makedirs() 来创建它和任何缺少的中介。 当我分析这段代码时,我发现大部分时间(132 秒中有 105 秒)都花在调用 posix.stat() 以确定中间目录不存在。但是我在一个空目录中构建了整个结构,所以我已经知道中间目录都不存在。
为了利用这一点,我编写了一个版本的代码,它保留了描述目录树结构的内部备忘录,以便它可以在不查询操作系统的情况下确定创建了哪些目录:
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)
这段代码运行得更快,但是当我通过分析器运行它时,对 os.mkdir() 的相同 4068 次调用现在需要 4 倍的时间(94 秒而不是 24 秒)。它不明白为什么这个函数从我的函数调用时比在 os.makedirs() 调用时花费更长的时间。 有人知道为什么吗?
【问题讨论】:
标签: python linux python-2.7 operating-system