我如何使更有效的函数:笛卡尔乘积和搜索排序的向量字符串元组



我开发了两个函数。笛卡尔积取集合并生成一个包含所有可能组合的元组的向量。然后对向量做一个小样本。第二个函数Searchsorted将两个元组向量作为输入,以获取与样本元组关联的较大向量的索引。

问题是我的函数太慢了(见下面的基准测试)

我将非常感谢您的反馈。我可以做些什么来改善执行时间?请记住,这是我的第一个Rust项目;我是Rust新手:)

方法的详细信息:

准备运行->代码库在这里:https://github.com/cdgaete/searchsorted

思路如下:我们有一个长格式的表(示例):

<表类>dim1dim2dim3价值tbody><<tr>"a1">"b2">"c1">10a2的b3的c2的20

这里有两个问题。

  1. 如何改进现有的实现,使其比Python
  2. 更快
  3. 如何实现更快的整体性能

几点建议:

关于1)。而不是let mut collector = Vec::new();。首先计算容量——将三个输入列表的长度相乘。然后做Vec::with_capacity。你将避免调整大小。

let mut htbl = HashMap::new();let mut location: Vec<i64> = Vec::new();的逻辑相同

关于2)。我发现,首先计算全表有很多冗余。笛卡尔积增长得很快,所以内存也会受到影响。你为什么不直接看最后的结果呢?首先将域列表list_1, list_2收集到hashmap中,以获得该值的索引。然后,对于索引列表的每一行,计算hashmap (index_1, index_2, index_3,…)中列值的索引,然后计算最终值为index_n + index_{n-1} * len_{n} + index_{n-2} * len_{n} * len_{n-1} +…,其中len_n -是list_n的长度。Len_n, Len_n *len_{n-1},…循环前应预先计算。总的来说,如果我们计算值的index_list明显小于完整的笛卡尔积

,可能会更快

最新更新