7个稳定版本
2.3.0 | 2024年7月10日 |
---|---|
2.2.1 | 2024年7月10日 |
2.2.0 | 2024年1月26日 |
2.0.0 | 2023年11月11日 |
1.2.0 | 2023年9月10日 |
#230 in 文本处理
331 每月下载量
在 pyadvreader 中使用
130KB
3.5K SLoC
advreader
此库提供了一种简单的方法,以字节切片的形式读取输入行,以提高效率。它基本上是标准库中的 lines,但它以字节切片的形式读取每一行(&[u8]
)。在您不太关心unicode的情况下,这比 lines()
执行得快得多,基本上和手动编写循环一样快。虽然代码本身相当简单,但我已经将它集成到最近写的至少4个工具中,所以我觉得是时候有一个方便的crate了。
安装
此工具将通过 Crates.io 提供,因此您可以在您的 Cargo.toml
中将其添加为依赖项
[dependencies]
advreader = "2.0.0"
用法
这很简单;在您通常在 BufRead
实现者上调用 lines
的地方,您现在可以调用 byte_lines
来检索一个用于遍历行作为 &[u8]
的结构(从而避免分配)。有两种使用API的方法,下面都展示了
// our input file we're going to walk over lines of, and our reader
let file = File::open("./my-input.txt").expect("able to open file");
let reader = BufReader::new(file);
let mut lines = reader.byte_lines();
// Option 1: Walk using a `while` loop.
//
// This is the most performant option, as it avoids an allocation by
// simply referencing bytes inside the reading structure. This means
// that there's no copying at all, until the developer chooses to.
while let Some(line) = lines.next() {
// do something with the line
}
// Option 2: Use the `Iterator` trait.
//
// This is more idiomatic, but requires allocating each line into
// an owned `Vec` to avoid potential memory safety issues. Although
// there is an allocation here, the overhead should be negligible
// except in cases where performance is paramount.
for line in lines.into_iter() {
// do something with the line
}
此接口是在 advreader
的 v2.x 线系中引入的。在 v1.x 中,已经实现了 Iterator
trait,但在尝试过于惯例化的同时,需要 unsafe
合同。这已经得到了修复,并且已经删除了所有不安全代码,同时为那些喜欢更简洁语法的人提供了 IntoIterator
实现。
依赖项
~230–395KB