3
def getSize(path):
    start_time = time.time()
    totalSize = 0
    if os.path.isdir(path):

        for dirpath, dirnames, filenames in os.walk(path):
            for fName in filenames:
                fp = os.path.join(dirpath, fName)
                totalSize += os.path.getsize(fp)
        print time.time() - start_time, "seconds"
        return totalSize

    else:
        return os.path.getsize(path)

上面的函数大约需要 25 秒才能找到现在包含大量文件的目录的大小。谁能告诉我一些有效的功能来做同样的事情,这样找到尺寸的时间会更短吗?

4

1 回答 1

2

问题不在于数据的大小,而在于包含它的文件的数量(可能很小)。我没有看到显着优化您的方法的方法 - 系统实用程序,例如du使用相同的方法计算大小。然而,这里有几个建议,按照难度和有效性的增加排序:

  • 对于一个小的加速,您可以滚动您自己的变体,从用于区分文件和目录os.walk的同一调用中获取文件大小。os.stat由于系统调用的数量减少,这可能会为您赢得一秒钟。

  • 您可以getSize使用 Python/C 或 Cython 进行编码,以避免在检查大量文件和目录时产生解释器开销。充其量,这可能会让您多花几秒钟。

  • 更改写入数据的代码以维护总大小或单个数据库(想想 sqlite)中的文件大小索引,该数据库本身可以被索引。这将使大小查找瞬间完成。

  • 监视正在写入的目录 usinginotify或等效项,并像以前一样将结果保存到数据库中。只要与读取相比,写入不频繁,这将是一项净赢的工作。它更难实现,但它的好处是不需要更改编写代码的代码。

于 2013-03-05T08:01:01.333 回答