Python 大数据的代码性能 os.path.getsize
Python code performance on big data os.path.getsize
下面是我按升序获取文件大小的代码。
def Create_Files_Structure(directoryname):
for path, subdirs, files in os.walk(directoryname,followlinks=False):
subdirs[:] = [d for d in subdirs if not d[0] == '.']
try:
files_list.extend([(os.path.join(path, file),os.path.getsize(os.path.join(path, file))) for file in files ])
except Exception as e:
print()
files_list.sort(key=lambda s: s[1], reverse=True)
for pair in files_list:
print(pair)
print(len(files_list))
start=time.time()
Create_Files_Structure("/home/<username>")
end=time.time()
print(end-start)
此代码有效,但如果目录大小以 TB 或 PB 为单位,性能会很慢。请提出任何改进代码以获得更快结果的建议。
好问题试试这个:
import time, os
def create_files_structuredire_2(ctoryname):
files_list = []
counter = 0
for dirpath, _, filenames in os.walk(ctoryname):
for items in filenames:
file_full_path = os.path.abspath(os.path.join(dirpath, items))
get_size = os.path.getsize(file_full_path)
files_list.append((file_full_path, get_size))
counter += 1
files_list.sort(key=lambda s: s[1], reverse=True)
[print(f) for f in files_list]
print(counter)
start = time.time()
create_files_structuredire_2("your_target_folder")
end = time.time()
print(end-start)
注意:你的时间是 0.044736385345458984,我的时间是 0.001501321792602539!!!!!!
祝你好运...
- 要了解您的速度有多快,请在目录上尝试 运行 和计时
du -k
。对于完整列表,您可能不会比 Python 更快。
- 如果您 运行 使用 Python < 3.5,请尝试升级或使用 scandir 以获得不错的性能改进。
- 如果您真的不需要整个文件列表但可以接受例如最大的 1000 个文件:
避免保留列表并使用 heapq.nlargest 和生成器
def get_sizes(root):
for path, dirs, files in os.walk(root):
dirs[:] = [d for d in dirs if not d.startswith('.')]
for file in files:
full_path = os.path.join(path, file)
try:
# keeping the size first means no need for a key function
# which can affect performance
yield (os.path.getsize(full_path), full_path)
except Exception:
pass
import heapq
for (size, name) in heapq.nlargest(1000, get_sizes(r"c:\some\path")):
print(name, size)
编辑 - 在 Windows 上变得更快 - os.scandir
产生已经包含有助于避免另一个系统调用的大小的条目。
这意味着使用 os.scandir
并自己递归,而不是依赖 os.walk
,后者不会产生该信息。
scandir PEP 471 中有一个类似的工作示例 get_tree_size()
函数,可以轻松修改以生成名称和大小。每个条目的大小都可以通过 entry.stat(follow_symlinks=False).st_size
.
访问
下面是我按升序获取文件大小的代码。
def Create_Files_Structure(directoryname):
for path, subdirs, files in os.walk(directoryname,followlinks=False):
subdirs[:] = [d for d in subdirs if not d[0] == '.']
try:
files_list.extend([(os.path.join(path, file),os.path.getsize(os.path.join(path, file))) for file in files ])
except Exception as e:
print()
files_list.sort(key=lambda s: s[1], reverse=True)
for pair in files_list:
print(pair)
print(len(files_list))
start=time.time()
Create_Files_Structure("/home/<username>")
end=time.time()
print(end-start)
此代码有效,但如果目录大小以 TB 或 PB 为单位,性能会很慢。请提出任何改进代码以获得更快结果的建议。
好问题试试这个:
import time, os
def create_files_structuredire_2(ctoryname):
files_list = []
counter = 0
for dirpath, _, filenames in os.walk(ctoryname):
for items in filenames:
file_full_path = os.path.abspath(os.path.join(dirpath, items))
get_size = os.path.getsize(file_full_path)
files_list.append((file_full_path, get_size))
counter += 1
files_list.sort(key=lambda s: s[1], reverse=True)
[print(f) for f in files_list]
print(counter)
start = time.time()
create_files_structuredire_2("your_target_folder")
end = time.time()
print(end-start)
注意:你的时间是 0.044736385345458984,我的时间是 0.001501321792602539!!!!!!
祝你好运...
- 要了解您的速度有多快,请在目录上尝试 运行 和计时
du -k
。对于完整列表,您可能不会比 Python 更快。 - 如果您 运行 使用 Python < 3.5,请尝试升级或使用 scandir 以获得不错的性能改进。
- 如果您真的不需要整个文件列表但可以接受例如最大的 1000 个文件:
避免保留列表并使用 heapq.nlargest 和生成器
def get_sizes(root):
for path, dirs, files in os.walk(root):
dirs[:] = [d for d in dirs if not d.startswith('.')]
for file in files:
full_path = os.path.join(path, file)
try:
# keeping the size first means no need for a key function
# which can affect performance
yield (os.path.getsize(full_path), full_path)
except Exception:
pass
import heapq
for (size, name) in heapq.nlargest(1000, get_sizes(r"c:\some\path")):
print(name, size)
编辑 - 在 Windows 上变得更快 - os.scandir
产生已经包含有助于避免另一个系统调用的大小的条目。
这意味着使用 os.scandir
并自己递归,而不是依赖 os.walk
,后者不会产生该信息。
scandir PEP 471 中有一个类似的工作示例 get_tree_size()
函数,可以轻松修改以生成名称和大小。每个条目的大小都可以通过 entry.stat(follow_symlinks=False).st_size
.