gpt4 book ai didi

c# - 提高此文本处理代码的效率

转载 作者:行者123 更新时间:2023-11-30 13:51:25 26 4
gpt4 key购买 nike

我正在编写一个程序来计算文本文件中已经是小写字母并以空格分隔的单词数。我想使用字典,并且只计算字典中的单词。问题是字典非常大(约 100,000 个单词),每个文本文档也有约 50,000 个单词。因此,我在下面编写的代码变得非常慢(在 quad i7 机器上处理一个文档大约需要 15 秒)。想知道是不是我的编码有问题,程序的效率是否可以提高。非常感谢你的帮助。代码如下:

public static string WordCount(string countInput)
{
string[] keywords = ReadDic(); /* read dictionary txt file*/

/*then reads the main text file*/
Dictionary<string, int> dict = ReadFile(countInput).Split(' ')
.Select(c => c)
.Where(c => keywords.Contains(c))
.GroupBy(c => c)
.Select(g => new { word = g.Key, count = g.Count() })
.OrderBy(g => g.word)
.ToDictionary(d => d.word, d => d.count);

int s = dict.Sum(e => e.Value);
string k = s.ToString();
return k;

}

最佳答案

您可以通过一次一行地读取文本文件而不是构建一个巨大的字符串来极大地提高性能。

你可以调用

File.ReadLines(path).SelectMany(s => s.Split(' '))

请勿调用 ReadAllLines ;它将需要建立一个巨大的阵列。


你的第一个Select调用完全没用。


你的 Contains调用将为文件中的每个单词循环遍历整个词典。
因此,Where调用是一个复杂度为 O(n2) 的操作。

更改 keywordsHashSet<string> .
由于可以在常数时间内搜索 HashSet,因此 Where call 会变成 O(n) 的操作,这样会好很多。


你的第二个 Select call 可以与 GroupBy 结合使用,这将减少大量的对象分配:

 .GroupBy(c => c, (word, set) => new { word, count = set.Count() })

字典本质上是无序的,所以你的 OrderBy打电话是浪费时间。

关于c# - 提高此文本处理代码的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4539460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com