两个大列表的快速联合
Fast union of two big lists
我在两个大列表(超过 100 万个条目)上使用 union,它很慢(几分钟)
我需要删除重复项的功能,所以我不能使用 concat 并且我的列表没有排序。
有没有更快的方法?也许使用 plinq
?
你不是说列表中的项目是什么,但一种选择是为此任务使用适当的数据结构 - 你只想保留唯一的项目 - 这是 SET 的定义,所以使用 HashSet。
var hashSet = new HashSet<int>(list1);
hashSet.UnionWith(list2);
我还测量了上面代码与 Linq.Union:
的时间
var list3 = list1.Union(list2).Distinct();
这是时间安排(HashSet.UnionWith 工作速度几乎快两倍):
HashSet.UnionWith
real 0m4.111s
user 0m3.890s
sys 0m0.132s
real 0m4.562s
user 0m4.074s
sys 0m0.170s
real 0m4.052s
user 0m3.851s
sys 0m0.129s
real 0m4.003s
user 0m3.814s
sys 0m0.125s
real 0m4.058s
user 0m3.858s
sys 0m0.126s
Linq.Union.Distinct
real 0m7.579s
user 0m7.014s
sys 0m0.428s
real 0m7.498s
user 0m6.965s
sys 0m0.419s
real 0m7.596s
user 0m6.994s
sys 0m0.412s
real 0m7.446s
user 0m6.917s
sys 0m0.416s
real 0m7.452s
user 0m6.928s
sys 0m0.403s
我在两个大列表(超过 100 万个条目)上使用 union,它很慢(几分钟)
我需要删除重复项的功能,所以我不能使用 concat 并且我的列表没有排序。
有没有更快的方法?也许使用 plinq
?
你不是说列表中的项目是什么,但一种选择是为此任务使用适当的数据结构 - 你只想保留唯一的项目 - 这是 SET 的定义,所以使用 HashSet。
var hashSet = new HashSet<int>(list1);
hashSet.UnionWith(list2);
我还测量了上面代码与 Linq.Union:
的时间var list3 = list1.Union(list2).Distinct();
这是时间安排(HashSet.UnionWith 工作速度几乎快两倍):
HashSet.UnionWith
real 0m4.111s
user 0m3.890s
sys 0m0.132s
real 0m4.562s
user 0m4.074s
sys 0m0.170s
real 0m4.052s
user 0m3.851s
sys 0m0.129s
real 0m4.003s
user 0m3.814s
sys 0m0.125s
real 0m4.058s
user 0m3.858s
sys 0m0.126s
Linq.Union.Distinct
real 0m7.579s
user 0m7.014s
sys 0m0.428s
real 0m7.498s
user 0m6.965s
sys 0m0.419s
real 0m7.596s
user 0m6.994s
sys 0m0.412s
real 0m7.446s
user 0m6.917s
sys 0m0.416s
real 0m7.452s
user 0m6.928s
sys 0m0.403s