2016-11-07 3 views
0

Обычно (до сих пор) Я стараюсь использовать неизменяемую коллекцию в Scala, тем более, что если я дам ссылку на коллекцию на какую-то другую часть моей программы, я не могу переопределить исходный источник случайно. Используя ветер, я хотел бы знать: почему было решено, что DenseVector будет изменчивой коллекцией?Почему DenseVector изменчивая коллекция?

Это просто (возможно, нежелательный) побочный эффект использования в массивах в фоновом режиме? Если да, почему были использованы массивы вместо другой (неизменной) коллекции?

ответ

3
  1. Производительность.

    Breeze uses netlib-java for its core linear algebra routines. This includes all the cubic time operations, matrix-matrix and matrix-vector multiplication. Special efforts are taken to ensure that arrays are not copied.

    DenseVector А при поддержке ничего, кроме массива будет значительно медленнее. Это может обернуть ImmutableArray который обертывание Array, но это заставит некоторые операции, которые могут избежать копий, будучи на месте, чтобы скопировать, может взаимодействовать с причудливыми специализациями и т.д.

  2. Я не знаю, насколько это важно (Я подозреваю, что не так много), но для людей, приезжающих на Бриз из численных вычислений (вместо Scala), ожидается изменчивость. Например. это упрощает перенос алгоритма, который реализован в Matlab или R в Breeze.

+0

2. Я вижу только половину права: Выполнить 'a = c (1,2); B = A; a [1] = 0' в R, 'a' будет' 0 2 3', а b будет '1 2 3'. Эквивалент в Scala был бы неизменным «var». – Make42

+0

Хотя, если DenseVector был бы неизменным, мне пришлось бы написать 'a = a (1): = 0' – Make42

+0

Да, Бриз ведет себя как Numpy в этом отношении, а не R или Matlab (IIRC), что потенциально может привести к запутыванию Пользователи R/Matlab. Опять же, я подозреваю, что это слабая причина (если вообще). –

1

Производительность. В то время как функциональное программирование обеспечивает отличные абстракции и жесткий код, он часто не предлагает самого быстрого исполнения. Массивы Java предлагают гораздо меньше накладных расходов, чем коллекции Scala, а также подходят для многократных числовых операций. Breeze DenseVector s аналогичны, и поддерживаются java-массивами под капотом.

Смежные вопросы