有没有一种方法可以优化用于SQL查询等迭代器的Rust过滤器?

问题描述

我注意到Rust迭代器在某种程度上类似于SQL查询。由于我不熟悉sql也不对其进行优化(尽管我确实确实对查询进行了大量优化),Rust或任何其他语言是否有办法优化迭代样式过滤器的编译时间?例如,

struct City {
    population: u64,name: String,}

fn heavy_computation_criteria(population: u64) -> bool {
    unimplemented!();
}

fn main() {
    let cities = vec![ ... ];
    let matches = cities
        .iter()
        .filter(|city| heavy_computation_criteria(city.population))
        .filter(|city| city.population > 1000)
        .map(|city| city.name);
}

类似于类似的东西

SELECT name FROM cities WHERE population > 1000 AND cities.heavy_computation_criteria(cities.population)

我想sql将首先通过填充而不是繁重的计算标准进行过滤。铁锈有这样的优化方法吗?

解决方法

我认为在某种程度上-是的。您可以想象,迭代器结构具有一个用于存储过滤器的字段,并且仅在栅栏点上(在您的示例中为map()上),它会计算过滤器。

由于过滤器是Rust中的闭包,因此语言运行时无法在编译之前对其进行评估。但是它可以进行一些启发式操作,例如,想到什么,在一个(很少)元素上评估每个存储的过滤器,以计算其成本。然后可以将它们从低成本重新排列为高成本。

请记住,我不知道这种方法是否可以提高速度。