Я работаю над решением для получения списка биграмм и количества каждой биграммы для заданного ввода.Производительность была плохой с большим вводом;Время выполнения заняло около 42 секунд для ввода 460 000 символов и 84 000 слов.Я изменил код, и теперь он работает нормально, но я не уверен, что именно вызвало проблему с производительностью.
В закомментированном коде была проблема.Я думал, что будет лучше, если я соберу биграмму и вхождения каждого биграма в 1 цикл, а не в два, но я ошибся.Получение индекса элемента в списке - при передаче параметра элемента через List.Where () - не представляется эффективным.Зачем?Оценивается ли предикат для каждого элемента в списке, даже при использовании FirstOrDefault () ?
Мое единственное мнение: даже если предикат не оценивается для каждого элемента в списке, я мог быпонять, почему использование List.IndexOf (List.Where ()) медленнее.Если в списке 84 000 элементов, FirstOrDefault () должен циклически проходить (я полагаю), пока не найдет первое совпадение, которое может быть с индексом 0 или 83 999, и это повторяется для каждого элемента всписок.
public class Bigram
{
public string Phrase { get; set; }
public int Count { get; set; }
}
public List<Bigram> GetSequence(string[] words)
{
List<Bigram> bigrams = new List<Bigram>();
List<string> bigramsTemp = new List<string>();
for (int i = 0; i < words.Length - 1; i++)
{
if (string.IsNullOrWhiteSpace(words[i]) == false)
{
bigramsTemp.Add(words[i] + " " + words[i + 1]);
//Bigram bigram = new Bigram()
//{
// Phrase = words[i] + " " + words[i + 1]
//};
//bigrams.Add(bigram);
//var matches = bigrams.Where(p => p.Phrase == bigram.Phrase).Count();
//if (matches == 0)
//{
// bigram.Count = 1;
// bigrams.Add(bigram);
//}
//else
//{
// int bigramToEdit =
// bigrams.IndexOf(
// bigrams.Where(b => b.Phrase == bigram.Phrase).FirstOrDefault());
// bigrams[bigramToEdit].Count += 1;
//}
}
}
var sequences = bigramsTemp.GroupBy(i => i);
foreach (var s in sequences)
{
bigrams.Add(
new Bigram()
{
Phrase = s.Key,
Count = s.Count()
});
}
return bigrams;
}