У меня есть несколько функций, которые я запускаю более миллиона раз для различных текстов, а это означает, что небольшие улучшения в этих функциях приводят к большим успехам в целом. В настоящее время я заметил, что все мои функции, связанные с подсчетом слов, выполняются значительно дольше, чем все остальное, поэтому я думаю, что хочу попробовать подсчет слов другим способом.
В основном, что делает моя функция захватывает несколько объектов, с которыми связан текст, проверяет, не соответствует ли этот текст определенным шаблонам, а затем подсчитывает количество слов в этом тексте. Базовая версия функции:
my $num_words = 0;
for (my $i=$begin_pos; $i<=$end_pos; $i++) {
my $text = $self->_getTextFromNode($i);
#If it looks like a node full of bogus text, or just a number, remove it.
if ($text =~ /^\s*\<.*\>\s*$/ && $begin_pos == $end_pos) { return 0; }
if ($text =~ /^\s*(?:Page\s*\d+)|http/i && $begin_pos == $end_pos) { return 0; }
if ($text =~ /^\s*\d+\s*$/ && $begin_pos == $end_pos) { return 0; }
my @text_words = split(/\s+/, $text);
$num_words += scalar(@text_words);
if ($num_words > 30) { return 30; }
}
return $num_words;
}
I ' m делаю множество сравнений текста, подобных тому, что я делаю здесь в другом месте своего кода, поэтому я предполагаю, что моя проблема должна быть связана с подсчетом слов. Есть ли более быстрый способ сделать это, чем разделение на \ s +
? Если да, то что это такое и почему быстрее (чтобы я мог понять, что делаю неправильно, и применить эти знания к аналогичным проблемам позже).