Time complexity of os.walk in Python

后端 未结 3 1449
离开以前
离开以前 2021-01-14 12:21

I\'ve to calculate the time-complexity of an algorithm, but in it I\'m calling os.walk which I can\'t consider as a single operation but many.

The sources of os.wal

3条回答
  •  日久生厌
    2021-01-14 12:45

    Well... let's walk through the source :)

    Docs: http://docs.python.org/2/library/os.html#os.walk

    def walk(top, topdown=True, onerror=None, followlinks=False):
        islink, join, isdir = path.islink, path.join, path.isdir
    
        try:
            # Note that listdir and error are globals in this module due
            # to earlier import-*.
    
    
            # Should be O(1) since it's probably just reading your filesystem journal
            names = listdir(top)
        except error, err:
            if onerror is not None:
                onerror(err)
            return
    
        dirs, nondirs = [], []
    
    
        # O(n) where n = number of files in the directory
        for name in names:
            if isdir(join(top, name)):
                dirs.append(name)
            else:
                nondirs.append(name)
    
        if topdown:
            yield top, dirs, nondirs
    
        # Again O(n), where n = number of directories in the directory
        for name in dirs:
            new_path = join(top, name)
            if followlinks or not islink(new_path):
    
                # Generator so besides the recursive `walk()` call, no additional cost here.
                for x in walk(new_path, topdown, onerror, followlinks):
                    yield x
        if not topdown:
            yield top, dirs, nondirs
    

    Since it's a generator it all depends on how far you walk the tree, but it looks like O(n) where n is the total number of files/directories in the given path.

提交回复
热议问题