1

我正在尝试将下面的代码转换为并行迭代器以提高性能:

// something like this
string.split(" ").enumerate().into_par_iter().for_each(|(_, b)| {
    // do something
});

但 Rayon 不支持.into_par_iter()Enumerate结构。而且对于 Rust 来说相对较新,我不确定如何解决这个问题。大多数其他问题都涉及向量,但它不在这里,因为我正在尝试执行以下操作:

  1. 获取一个字符串:String::from("Lorem ipsum dolor sit amet")
  2. 使用.split(" ").enumerate()把它变成一个向量:vec!["Lorem", "ipsum", "dolor", sit", "amet"]

那么如何让上面的代码并行运行呢?

4

1 回答 1

1

您可以使用.par_bridge()将任何迭代器转换为并行迭代器:

这通过将其项目分布在 Rayon 线程池中,创建了从顺序迭代器到并行迭代器的“桥梁”。这具有能够并行化几乎任何东西的优点,但是生成的 ParallelIterator 可能比使用 par_iter 开始时效率低。但是,对于难以通过其他方式并行化的迭代器(例如通道或文件或网络 I/O),它仍然很有用。

生成的迭代器不能保证保持原始迭代器的顺序。

use rayon::iter::ParallelBridge;

string.split(" ").enumerate().par_bridge().for_each(|(_, b)| {
    // do something
});
于 2022-01-09T06:56:45.707 回答