Является ли идиоматический стиль кодирования Scala классной ловушкой для написания неэффективного кода?

Я чувствую, что сообщество Scala немного одержимо написанием «краткий», «крутой», «scala idiomatic» , «один -лайнер "-если возможно- код. За этим сразу же следует сравнение с Java / императивным / некрасивым кодом.

Хотя это (иногда) приводит к легкому пониманию кода, это также приводит к неэффективному коду для 99% разработчиков. И именно здесь Java / C ++ нелегко превзойти.

Рассмотрим эту простую задачу: Дан список целых чисел, удалить самый большой элемент. Необязательно сохранять порядок.

Вот моя версия решения (Возможно, она не самая лучшая, но это то, что сделал бы среднестатистический разработчик, не принадлежащий к Rockstar).

def removeMaxCool(xs: List[Int]) = {
  val maxIndex = xs.indexOf(xs.max);
  xs.take(maxIndex) ::: xs.drop(maxIndex+1)
}

Это идиоматичный, лаконичный и использующий язык Scala несколько хороших функций списков. К тому же это очень неэффективно. Он проходит по списку не менее 3 или 4 раз.

Вот мое совершенно не крутое, похожее на Java решение. Это также то, что написал бы разумный Java-разработчик (или новичок в Scala).

def removeMaxFast(xs: List[Int]) = {
    var res = ArrayBuffer[Int]()
    var max = xs.head
    var first = true;   
    for (x <- xs) {
        if (first) {
            first = false;
        } else {
            if (x > max) {
                res.append(max)
                max = x
            } else {
                res.append(x)
            }
        }
    }
    res.toList
}

Совершенно не-Scala идиоматический, нефункциональный, неточный, но очень эффективный. Он проходит по списку только один раз!

Итак, если 99% разработчиков Java пишут более эффективный код, чем 99% разработчиков Scala, это огромное препятствие, которое нужно преодолеть для более широкого принятия Scala. Есть ли выход из этой ловушки?

Я ищу практический совет, чтобы избежать таких «ловушек неэффективности», сохраняя при этом ясность и краткость реализации.

Пояснение: Этот вопрос исходит из сценария из реальной жизни: Пришлось написать сложный алгоритм. Сначала я написал его на Scala, потом мне «пришлось» переписать на Java. Реализация на Java была вдвое длиннее и не настолько четкой, но в то же время в два раза быстрее. Переписывание кода Scala для повышения его эффективности, вероятно, потребует некоторого времени и более глубокого понимания внутренней эффективности Scala (для сопоставления и сопоставления и т. Д.)

54
задан Adrian 17 August 2011 в 11:39
поделиться