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 秒才能找到当前包含大量文件的目录的大小。谁能告诉我一些有效的函数来做同样的事情,这样找到尺寸的时间就更少了?
最佳答案
问题不在于数据的大小,而在于包含它的(可能很小的)文件的数量。我看不出有什么方法可以显着优化您的方法 - 像 du
这样的系统实用程序使用相同的方法计算大小。不过,这里有一些建议,按照难度和有效性的递增顺序排列:
为了小幅加速,您可以推出您自己的
os.walk
变体,它从用于区分两者的相同os.stat
调用中获取文件大小文件和目录。由于减少了系统调用的数量,这可能会给您带来一秒钟的时间。您可以在 Python/C 或 Cython 中编写
getSize
代码,以避免在检查大量文件和目录时产生解释器开销。这最多可能会让你多等几秒钟。更改写入 数据的代码,以同时维护总大小,或单个数据库(想想 sqlite)中的文件大小索引,它本身可以被索引。这将使尺寸查找瞬间完成。
使用
inotify
监控正在写入的目录或等价物,并像以前一样将结果保存到数据库中。只要与读取相比写入不频繁,这将是一个净赢的工作。它更难实现,但它的好处是不需要更改编写代码的代码。
关于python-2.7 - 高效的python函数查找目录的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15218192/