Эффективность чисто функционального программирования

Чтение строк форматирования

  • '%' является оператором строки форматирования
  • '+' будет оператор concat

395
задан Brian Campbell 23 January 2010 в 00:00
поделиться

5 ответов

Быть ленивым, я не проверяет это, но не должен эту работу

private int FindClosest(IEnumerable<int> numbers, int x)
{
    return
        numbers.Aggregate((r,n) => Math.Abs(r-x) > Math.Abs(n-x) ? n
                                 : Math.Abs(r-x) < Math.Abs(n-x) ? r
                                 : r < x ? n : r);
}
-121--3853861-

согласно Pippengenge [1996] , при сравнении системы LISP, которая является чисто Функциональный (и имеет строгую оценочную семантику, не лень) к тому, что может мутировать данные, алгоритм, написанный для нечистого LISP, который работает в O ( N ), может быть переведен в алгоритм в чистом Lisp, который работает В O ( N log N ) Время (на основе работы Ben-Amram и Galil [1992] о моделировании памяти произвольного доступа, используя только указатели). Пиппенг также устанавливает, что есть алгоритмы, для которых это лучшее, что вы можете сделать; Существуют проблемы, которые являются o ( n ) в нечистой системе, которые являются ω ( N log n ) в чистой системе.

Есть несколько предостережений, которые должны быть сделаны в этой статье. Наиболее значимым является то, что он не учитывает ленивые функциональные языки, такие как Haskell. Птица, Джонс и Де Мар [1997] демонстрируют, что проблема, построенная с помощью пипергенга, может быть решена на ленивом функциональном языке в O ( n ) времени, но они не устанавливают (и Насколько я знаю, ни у кого нет), может ли ленивый функциональный язык решить все проблемы в том же асимптотическом времени работы в качестве языка с мутацией.

Проблема, построенная с помощью пипергенга, требует ω ( N log n ), специально построена для достижения этого результата, и не обязательно является представителем практических, реальных проблем. Существует несколько ограничений на проблему, которые немного неожиданно, но необходимо для доказательства для работы; В частности, проблема требует, чтобы результаты вычисляются в режиме онлайн, не имея возможности получить доступ к будущему вводу, и что вход состоит из последовательности атомов из неограниченного набора возможных атомов, а не набор фиксированного размера. И бумага устанавливает только (нижние связанные) результаты для нежамого алгоритма линейного времени работы; Для проблем, которые требуют большего времени эксплуатации, возможно, что дополнительный o (log n ) фактор, видимый в линейной задаче, может быть «поглощен» в процессе дополнительных операций, необходимых для алгоритмов с больше времени работы. Эти разъяснения и открытые вопросы кратко рассмотрены Ben-Amram [1996] .

На практике многие алгоритмы могут быть реализованы на чистом функциональном языке с той же эффективностью, что и на языке с помощью смежных структур данных. Для хорошей ссылки на методы использования для реализации чисто функциональных структур данных эффективно, см. «Чисто функциональные структуры данных Chris Okasaki» [Okasaki 1998] (что является расширенной версией его тезиса [Okasaki 1996 ] ).

Любой, кому нужно реализовать алгоритмы на чисто функциональных структурах данных, следует прочитать окасаки. Вы всегда можете получить в худшем случае o (log n ) замедление на операцию, моделируя измельченную память с сбалансированным бинарным деревом, но во многих случаях вы можете сделать значительно лучше, чем это, и Окасаки описывает много полезных методик, от амортизированных методов для реального времени, которые делают амортизированную работу постепенно. Чисто функциональные структуры данных могут быть немного сложными для работы и анализировать, но они предоставляют многие преимущества, такие как ссылочная прозрачность, которые полезны в оптимизации компилятора, параллельно и распределенные вычисления, а также в реализации функций, таких как управление версиями, отменить и откат.

Обратите внимание, что все это обсуждает только асимптотическое время работы. Многие методы для реализации чисто функциональных структур данных дают вам определенное количество постоянного замедления фактора из-за дополнительного бухгалтерии, необходимого им для работы, а также детали реализации языка. Преимущества чисто функциональных структур данных могут перевесить эти постоянные замедления фактора, поэтому вам, как правило, необходимо сделать компромиссы на основе рассматриваемой проблемы.

Ссылки

528
ответ дан 22 November 2019 в 23:43
поделиться

Я бы предложил прочитать о производительности Хаскелла , а затем взглянуть на производительность бенчмарковой игры для функциональных языков в сравнении с процедурными/OO.

.
1
ответ дан 22 November 2019 в 23:43
поделиться

С фиксированным верхним пределом по использованию памяти разница не должна быть.

Доказательный эскиз: При фиксированном верхнем пределе использования памяти, вы должны быть в состоянии написать виртуальную машину, которая выполняет набор императивных инструкций с той же асимптотической сложностью, как если бы вы выполнялись на этой машине. Это так, потому что вы можете управлять мутируемой памятью как постоянной структурой данных, давая O(log(n)) читать и записывать, но с фиксированным верхним ограничением на использование памяти, вы можете иметь фиксированный объем памяти, приводящий к ее распаду до O(1). Таким образом, функциональная реализация может быть императивной версией, запущенной в функциональной реализации ВМ, и поэтому обе они должны иметь одинаковую асимптотическую сложность.

.
4
ответ дан 22 November 2019 в 23:43
поделиться

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

Тот факт, что в других ответах утверждается, что никакой разницы быть не может и что, например, единственным "недостатком" чисто функционального кода является то, что он может быть распараллелен, дает представление об информированности/объективности сообщества функционального программирования по этим вопросам.

EDIT:

Комментарии ниже указывают на то, что предвзятое обсуждение "за" и "против" чисто функционального программирования может и не исходить от "функционального сообщества программирования". Хорошее замечание. Возможно, адвокаты, которых я вижу, просто цитируют комментарий, "неграмотные".

Например, я думаю, что этот пост в блоге написан кем-то, кого можно назвать представителем функционального программирующего сообщества, и поскольку это список "баллов за ленивое оценивание", то было бы неплохо упомянуть любой недостаток, который может иметь ленивое и чисто функциональное программирование. Хорошее место могло бы занять следующее (технически верное, но предвзятое до не смешного) исключение:

Если строгая функция имеет сложность O(f(n)) в строгом языке, то она имеет сложность O(f(n)) и в ленивом языке. Зачем беспокоиться? :)

36
ответ дан 22 November 2019 в 23:43
поделиться

Действительно, существует несколько алгоритмов и структур данных, для которых не известно асимптотически эффективное чисто функциональное решение (например, одно, реализуемое в чистом лямбда-исчислении), даже если это будет лень.

  • Вышеупомянутый поиск объединения
  • Хеш-таблицы
  • Массивы
  • Некоторые алгоритмы работы с графами
  • ...

Однако мы предполагаем, что в «императивных» языках доступ к памяти составляет O (1) тогда как в теории это не может быть асимптотически (т.е. для неограниченного размера проблемы), а доступ к памяти в огромном наборе данных всегда равен O (log n), что можно эмулировать на функциональном языке.

Кроме того, мы должны помнить, что фактически все современные функциональные языки предоставляют изменяемые данные, а Haskell даже предоставляет их без ущерба для чистоты (монада ST).

44
ответ дан 22 November 2019 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: