我开发了两个函数。笛卡尔积取集合并生成一个包含所有可能组合的元组的向量。然后对向量做一个小样本。第二个函数Searchsorted将两个元组向量作为输入,以获取与样本元组关联的较大向量的索引。
问题是我的函数太慢了(见下面的基准测试)
我将非常感谢您的反馈。我可以做些什么来改善执行时间?请记住,这是我的第一个Rust项目;我是Rust新手:)方法的详细信息:
准备运行->代码库在这里:https://github.com/cdgaete/searchsorted
思路如下:我们有一个长格式的表(示例):
这里有两个问题。
- 如何改进现有的实现,使其比Python 更快
- 如何实现更快的整体性能
几点建议:
关于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明显小于完整的笛卡尔积
,可能会更快