Когда я пытался реализовать функцию для подсчета совпадений слов в scala, я обнаружил, что производительность моей функции действительно низкая.
Совпадения слов:
То есть у нас естьList [List [Int]] (фактически список слов),
, мы сгенерируем комбинацию для каждого List [Int],
, затем мы объединяем все комбинации в карту и суммируем значение для каждого дублирующегося ключа..
Комбинация:
[0,1,2] -> [((0,1), 1), ((0,2), 1), ((1,2), 1)]
Комбинация слияний:
[((0,1), 1), ((0,2), 1), ((1,2), 1)] + [((0, 1), 1), ((0,2), 1), ((1,2), 1)] =
HashMap {(0,1): 2, (0,2): 2, (1,2): 2}
Вот версия Scala:
val arr = Array.range(0, 1000)
val counter = scala.collection.mutable.HashMap[(Int, Int), Int]( )
arr.combinations(2).toArray.map{
row=>
val key = (row(0), row(1))
if (!counter.contains(key)) {
counter(key) = 1
}
else {
counter(key) += 1
}
}
assert(counter.size == 499500)
Версия Scala 2:
val counter = arr.combinations(2).map(x => ((x(0),x(1)), 1)).toArray
.groupBy(_._1).mapValues(_.map(_._2).sum)
Вот версия Python:
import itertools
arr = range(0, 1000)
combs = list(itertools.combinations(arr, 2))
counter = dict()
for key in combs:
try:
counter[key] += 1
except KeyError:
counter[key] = 1
assert len(counter) == 499500
Обе версии Scala стоят 9 секунд, в то время как версия Python стоит 1 секунду.
Я думаю, что я определенно делаю что-то не так с кодом, но я не мог придумать другие способы улучшить его (я новичок в Scala).
Кроме того, причина, по которой я былиспользуя mutable.HashMap - это то, что я хочу уменьшить использование памяти.
Любая помощь будет оценена, спасибо.