나는 큰 디렉토리 구조를 만들어야하는 프로젝트를 작업 해왔다. 내 첫 번째 솔루션은 존재하는 모든 dirs의 dict을 유지하는 것이었고 os.makedirs()를 사용하여 만들어지지 않은 중개자를 생성하는 경우에는 누락 된 중개자를 생성하는 것이 었습니다. 이 코드의 프로파일을 작성했을 때, 대부분의 시간 (132 초 중 105 초)이 posix.stat()을 호출하여 중개 디렉토리가 존재하지 않는다는 것을 확인하는 데 소비되었음을 알게되었습니다. 그러나 나는 빈 디렉토리에이 전체 구조를 만들었으므로 중간 디렉토리가 존재하지 않는다는 것을 이미 알고 있었다.명시 적으로 호출 할 때 os.mkdir()이 느린 이유는 무엇입니까?
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를 쿼리하지 않고 생성 된의 디렉토리를 결정할 수 있도록 내부 메모 디렉토리 트리의 구조를 설명하는 코드의 버전을 썼다 이 코드는 더 빨리 실행되지만 프로파일 러를 통해 실행할 때 os.mkdir()에 대한 동일한 4068 호출이 이제 4 배 더 길어집니다 (24 초 대신 94 초). os.makedirs()가 호출 할 때보 다이 함수가 내 함수라고 할 때 왜이 함수가 더 오랜 시간이 걸리는지 이해하지 못합니다. 아무도 이유가 무엇입니까?
나는 그것이 C면에 있다고 생각하지 않습니다. 'stat()'호출을하는'makedirs()'에서'head와 tail이 아니라 path.exists (head) :'가 아닌 것으로 보인다. – glglgl