我有一个包含大量文件(约 100 万)的目录。我需要从此目录中选择一个随机文件。由于文件太多,os.listdir
自然需要永恒的时间才能完成。
有什么办法可以绕过这个问题吗?也许以某种方式了解目录中的文件数量(不列出它)并选择随机生成 n 的第 n 个文件?
目录中的文件是随机命名的。
唉,我认为你的问题没有解决办法。第一,我不知道可移植的 API 会返回目录中的条目数(不首先枚举它们)。第二,我认为没有 API 可以按号码而不是按名称返回目录条目。
因此,总的来说,程序必须枚举 O(n) 目录条目才能获得单个随机条目。确定条目数量然后选择一个的简单方法要么需要足够的 RAM 来保存完整的列表(os.listdir()
)或者必须第二次枚举目录才能找到随机(n)项 - 总体而言n+n/2
平均操作数。
有稍微更好的方法 - 但只是稍微好一点 - 请参阅从文件中随机选择行 https://stackoverflow.com/questions/3009832#3011085。简而言之,有一种方法可以从长度未知的列表/迭代器中选择随机项目,同时一次读取一个项目并确保可以以相同的概率选择任何项目。但这无济于事os.listdir()
因为它已经返回了list
在已经包含所有 1M+ 条目的内存中 - 所以你也可以询问它len()
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)