大数据os.path.getsize上的Python代码性能

大数据os.path.getsize上的Python代码性能,python,python-3.x,performance,os.walk,Python,Python 3.x,Performance,Os.walk,下面是我按升序获取文件大小的代码 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

下面是我按升序获取文件大小的代码

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)
def Create_Files_结构(目录名):
对于os.walk(directoryname,followlinks=False)中的路径、子目录和文件:
子分区[:]=[d表示子分区中的d,如果不是d[0]='.]
尝试:
文件\u list.extend([(os.path.join(path,file),os.path.getsize(os.path.join(path,file)))用于文件中的文件])
例外情况除外,如e:
打印()
文件\u list.sort(key=lambda s:s[1],reverse=True)
对于文件中的配对\u列表:
印刷品(双)
打印(len(文件列表))
开始=时间。时间()
创建文件\u结构(“/home/”)
end=time.time()
打印(结束-开始)

此代码正在工作,但若目录的大小以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,请尝试升级或使用,以提高性能
  • 如果您确实不需要整个文件列表,但可以使用最大的1000个文件:
  • 避免保留列表并与生成器一起使用

    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操作系统上运行得更快。scandir产生的条目已经包含了大小,有助于避免另一次系统调用

    这意味着使用
    os.scandir
    并递归自己,而不是依赖于
    os.walk
    ,后者不会产生这些信息


    中有一个类似的工作示例
    get\u tree\u size()
    函数,可以轻松修改该函数以生成名称和大小。每个条目的大小都可以通过
    entry.stat(follow_symlinks=False)访问。st_size

    当您的代码运行时,解决这类问题的一个更好的地方是您没有从扫描中筛选“.”子菜单-尝试将其计时,以比较您的意思是>Python 3.5?@brandonscript in Python>=3.5它是内置的,在旧版本中,你会考虑我链接的图书馆,使它成为标准图书馆,是的,抱歉。在你的2。您使用<而不是>=,而且它的措辞让它听起来像是您可以使用scandir,如果您使用的是3.5或更高版本。明白。我在回答这个问题时,正在寻找加快代码速度的建议:升级到3.5+会使
    os.walk
    更快,这要归功于
    scandir
    的基本使用,而直接将scandir用作外部模块将给3.5之前的版本带来相同的效果。也许我可以说得更清楚些