是否可以获得部分目录列表?
在 Python 中,我有一个进程试图获取os.listdir
包含超过 100,000 个文件的目录,并且它需要很长时间。比方说,我希望能够快速获得前 1,000 个文件的列表。
我怎样才能做到这一点?
我找到了一个解决方案,可以让我随机排列文件:)(至少我看不到模式)
首先,我在 python 邮件列表中找到了这篇文章。您必须将 3 个附加文件复制到磁盘 ( opendir.pyx, setup.py, test.py
)。接下来,您需要 python 包Pyrex来编译opendir.pyx
帖子中的文件。我在安装 Pyrex 时遇到问题,发现我必须python-dev
通过apt-get
. 接下来,我opendir
从上面下载的三个文件中安装了包python setup.py install
。该文件test.py
包含如何使用它的示例。
接下来,我对这个解决方案比使用 os.listdir 快多少感兴趣,我使用以下小 shellscript 创建了 200000 个文件。
for((i=0; i<200000; i++))
do
touch $i
done
以下脚本是我在刚刚创建文件的目录中运行的基准测试:
from opendir import opendir
from timeit import Timer
import os
def list_first_fast(i):
d=opendir(".")
filenames=[]
for _ in range(i):
name = d.read()
if not name:
break
filenames.append(name)
return filenames
def list_first_slow(i):
return os.listdir(".")[:i]
if __name__ == '__main__':
t1 = Timer("list_first_fast(100)", "from __main__ import list_first_fast")
t2 = Timer("list_first_slow(100)", "from __main__ import list_first_slow")
print "With opendir: ", t1.repeat(5, 100)
print "With os.list: ", t2.repeat(5, 100)
我的系统上的输出是:
With opendir: [0.045053958892822266, 0.04376697540283203, 0.0437769889831543, 0.04387712478637695, 0.04404592514038086]
With os.list: [9.50291895866394, 9.567682027816772, 9.865844964981079, 13.486984968185425, 9.51977801322937]
正如你所看到的,当返回一个包含 200000 个文件名中的 100 个文件名的列表时,我得到了 200 倍的加速,这非常好:)。
我希望这是你想要达到的目标。