快速目录扫描程序。

scandir-rs的Python项目详细描述


scandir-rs

scandir_rs是与os.walk()类似的目录迭代模块,但具有更多的特性和更高的速度。取决于函数调用 它生成一个路径列表、按条目类型分组的列表元组或DirEntry对象,其中包括文件类型和状态信息 带着名字。使用scandir_rs大约是2-17倍,比os.walk()快2-17倍(取决于平台、文件系统和文件树结构) 通过在后台并行化迭代。在

如果您只对目录统计感兴趣,可以使用子模块count。在

scandir_rs包含以下子模块:

  • count用于确定目录的统计信息。在
  • walk用于获取目录项的名称。在
  • scandir获取目录项的详细统计信息。在

有关API,请参见:

安装

为了从源代码构建这个轮子,您需要使用Rust和工具nightly和工具maturin。在

切换到频道nightly

rustup default nightly

安装maturin

^{pr2}$

构建控制盘(不在Windows上):

maturin build --release --strip

在Windows上构建控制盘:

maturin build --release --strip --no-sdist

maturin将为系统上安装的所有Python版本构建控制盘。在

为不同的Python版本构建和运行测试

为了更容易为几个不同的Python版本构建轮子,添加了脚本build_wheels.sh。 它为Python版本3.6、3.7、3.8和3.9创建轮子。此外,它在成功创建每个控制盘后运行pytest。在

为了能够运行脚本,首先需要安装pyenv,包括上面提到的所有Python解释器版本。在

关于如何安装pyenv的说明可以在here找到。在

示例

获取目录的统计信息:

importscandir_rsasscandirprint(scandir.count.count("~/workspace",extended=True))

相同,但在后台使用类实例异步:

importscandir_rsasscandirscanner=scandir.count.Count("~/workspace",extended=True))scanner.start())# Start background thread pool...value=scanner.statistics# Can be read at any time...scanner.stop()# If you want to cancel the scanner

使用上下文管理器:

importscandir_rsasscandirC=scandir.count.Count("~/workspace",extended=True))withC:whileC.busy():statistics=C.statistics# Do something

{cd3}示例:

importscandir_rsasscandirforroot,dirs,filesinscandir.walk.Walk("~/workspace"):# Do something

使用扩展数据:

importscandir_rsasscandirforroot,dirs,files,symlinks,other,errorsinscandir.walk.Walk("~/workspace",return_type=scandir.RETURN_TYPE_EXT):# Do something

os.scandir()示例:

importscandir_rsasscandirforpath,entryinscandir.scandir.Scandir("~/workspace",return_type=scandir.RETURN_TYPE_EXT):# entry is a custom DirEntry object

基准

examples/benchmark.py

下表中scandir行_步行街返回可比 结果到手术室步行. 在

Linux,Ryzen 5 2400G和SSD

目录/usr,其中

  • 83790个目录
  • 671847个文件
  • 48480个符号链接
  • 1278个硬链接
  • 0个设备
  • 0个管道
  • 30.3GB大小和31.9GB磁盘使用率
Time [s]Method
5.319os.walk (Python 3.8)
13.351os.walk+os.stat (Python 3.8)
0.918scandir_rs.count.count
1.340scandir_rs.count.count(extended=True)
0.812scandir_rs.count.Count
1.663scandir_rs.walk.toc
1.107scandir_rs.walk.Walk (iter)
1.775scandir_rs.walk.Walk (collect)
2.511scandir_rs.scandir.entries (RETURN_TYPE_FAST)
2.561scandir_rs.scandir.entries (RETURN_TYPE_BASE)
2.496scandir_rs.scandir.entries (RETURN_TYPE_EXT)
2.881scandir_rs.scandir.entries (RETURN_TYPE_FULL)
2.437scandir_rs.scandir.entries (iter, RETURN_TYPE_FULL)

目录linux-5.5.5,其中

  • 4391个目录
  • 66459个文件
  • 35个符号链接
  • 13个硬链接
  • 0个设备
  • 0个管道
  • 870.7MB大小和1021.5MB磁盘使用率
^{tb2}$

在Linux上,速度高达~5倍。在

Windows 10,带笔记本核心i7-4810MQ@2.8GHz笔记本电脑,MTF SSD

目录C:\Windows

  • 130429个目录
  • 426588个文件
  • 0符号链接
  • 53563硬链接
  • 0个设备
  • 0个管道
  • 49.8GB大小和50.9GB磁盘使用率
^{3}$

目录linux-5.5.5,其中

  • 4391个目录
  • 66459个文件
  • 35个符号链接
  • 13个硬链接
  • 0个设备
  • 0个管道
  • 870.7MB大小和1021.5MB磁盘使用率
^{tb2}$

在Windows 10上,速度高达6.7倍。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Spring引导应用程序中的java循环视图路径异常   java在PreferenceActivity中显示ProgressDialog   java RESTEasy如何将基本身份验证设置为ClientRequest   使用MongoDB进行java漏斗分析?   java JUnit系统日期   java创建一个集合,每个类有一个对象   java如何在子模块项目中测试Springbean   java Websocket服务器Android   javaitext:如何在新页面上重复表单元格内容?   java一旦spring mvc样板项目建立起来,python/RoR的开发速度会更快吗?   java为什么Maven Tycho不能在工具链中找到正确的JDK。xml?   Java Selenium获取用于单击的元素   java如何使用嵌套的if语句而不是系统阻止程序在blueprint类中运行。出口(0);?   java模板聚合匹配和投影一个没有id的字段   java您的内容必须有一个id属性为“安卓”的TabHost。安卓应用程序的R.id.tabhost错误   JavaEclipseLink 1.2和BatchFetch   java如何更改HttpClient中的超时值?   java在toString方法中将对象转换为特定数据类型   java正在跳过运行for循环