Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.77.149] |
|
Страницы: (16) « Первая ... 9 10 [11] 12 13 ... 15 16 все ( Перейти к последнему сообщению ) |
Сообщ.
#151
,
|
|
|
Ну а тебе какие примеры нужны? Ленивые списки позволяют оптимизировать обработку легко и непринужденно. Без ленивости тоже самое получается либо не так удобно и/или неоптимально. Выбор за программистом.
Цитата Исмаил Прокопенко @ Нет. Оптимизация делается на стадии компиляции, а в данном примере значение переменной flag - на стадии компиляции неизвестно, поэтому компилятор не выбросит функцию heavyFun().Все что Вы описали мне кажется называется не "ленивые вычисления", а "оптимизация", когда часть компилятора, называемая "оптимизатор" анализируя зависимости выбрасывает неиспользуемый код. Цитата Oleg2004 @ Там много Хаскеля, не думаю, что автор темы осилит. Вот здесь Очень хорошее описание - что можно назвать так называемыми "ленивыми вычислениями." Исчерпывающе |
Сообщ.
#152
,
|
|
|
Цитата Oleg2004 @ Вот здесь Очень хорошее описание - что можно назвать так называемыми "ленивыми вычислениями." Исчерпывающе "Самый очевидный плюс ленивых вычислений — если что-то не требуется, оно не будет вычислено." Не вижу никакого плюса. Как правило, если у программиста все нормально с головой, он и так не пишет код, который не требуется выполнять. К тому же все равно не ясно, чем "ленивые вычисления" отличаются от банальной "оптимизации" - стандартной фичи ВСЕХ компиляторов ВСЕХ языков? Добавлено Цитата applegame @ Оптимизация делается на стадии компиляции, а в данном примере значение переменной flag - на стадии компиляции неизвестно, поэтому компилятор не выбросит функцию heavyFun(). Дык еще со времени СИ (это 50 лет назад) логические операторы вычисляются не до конца если результат уже известен. Добавлено Вообщем хрень какая-то Если бы реально была штука полезная - её бы во все языки ввели, как это было с ОО парадигмой, когда из-за ООП истерии ООП стали пихать во все языки |
Сообщ.
#153
,
|
|
|
Ну вот ещё пример. Была функция
QList<BlaBla> get_all_items() for(auto item: foo->get_all_items()) {...} Цитата Исмаил Прокопенко @ К тому же все равно не ясно, чем "ленивые вычисления" отличаются от банальной "оптимизации" - стандартной фичи ВСЕХ компиляторов ВСЕХ языков? Компилятор, способный на описанную выше оптимизацию, в студию. |
Сообщ.
#154
,
|
|
|
И потом, все хорошо в теории и красиво смотрится на искусственно подобранных для иллюстрации примерах.
А если опуститься на уровень реализации? Как я думаю (рассуждая сам с собой), компилятор "ленивых языков" во все точки, где используется значение некоторой переменной А, вставляет на саму переменную А, а ссылку на код, где она вычисляется. Т.е. компилятор как бы оформляет автоматом все выражения вида А=Б+Г в виде функции int А(int Б, int Г); а потом во все точки, где используется переменная А, вставляет не значение А, а вызов функции А. Что-то мне не нравится такое решение. Кривое какое-то Добавлено Цитата OpenGL @ Компилятор, способный на описанную выше оптимизацию, в студию. Мне не знакомы эти контсрукции. Приведите пример на СИ или Паскале Добавлено Цитата OpenGL @ Поэтому она была переписана так, чтобы она возвращала нечто, по чему можно пройтись таким вот for-ом Хотите сказать, что компилятор хаскеля может распотрошить функцию и вытащить из неё только то, что реально нужно для данного кода? Т.е. фактически ПЕРЕПИСАТЬ функцию так, чтобы она работала наиболее оптимально? Тогда это реально круто |
Сообщ.
#155
,
|
|
|
Цитата Исмаил Прокопенко @ Дык в неленивом языке значение функции heavyFun будет вычислено до проверки flag. Дык еще со времени СИ (это 50 лет назад) логические операторы вычисляются не до конца если результат уже известен |
Сообщ.
#156
,
|
|
|
Цитата Oleg2004 @ Вот здесь Очень хорошее описание - что можно назвать так называемыми "ленивыми вычислениями." Исчерпывающе Описание мне лично не нужно Мне бы реальных кейсов и реального профита. Добавлено Цитата applegame @ Ну а тебе какие примеры нужны? Реальные. Синтетику я много где видел и про нее читал. На практике слышал о проблемах с нежелательным каскадным росте реальных вычислений (когда система долго что-то "считала", а на самом деле "копила" необходимые вычисления и при попытке что-то реально посчитать вылетала по памяти). Слышал, что отлаживать это дело - то еще удовольствие. Вот хотелось бы услышать хорошие примеры. Добавлено Цитата applegame @ Оптимизация делается на стадии компиляции, а в данном примере значение переменной flag - на стадии компиляции неизвестно, поэтому компилятор не выбросит функцию heavyFun(). Ну принимай вместо lazy string функцию Нужна мемоизация? Сделай, вроде не сложно Добавлено Цитата OpenGL @ Была функция QList<BlaBla> get_all_items() for(auto item: foo->get_all_items()) {...} Это не ленивость. Это просто range/iterator. Цитата QList под капотом вроде массив, а не связанный список.В языке с ленивостью весь этот огород бы не потребовался - я бы просто объявил список ленивым, и получил бы ровно тот же эффект. Не надо забывать про ограничения ленивых структур. Односвязный список - ок, но что будем делать в более сложном случае? А вместо односвязных ленивых списков вполне используют классические итераторы/стримы/etc. Или я тебя не понял? Можешь псевдокодом показать? |
Сообщ.
#157
,
|
|
|
Цитата D_KEY @ Это не ленивость. Это просто range/iterator. В данном контексте это вполне можно назвать ленивым вычислением списка. Цитата D_KEY @ QList под капотом вроде массив, а не связанный список. Спасибо, но я в курсе |
Сообщ.
#158
,
|
|
|
Цитата OpenGL @ Цитата D_KEY @ QList под капотом вроде массив, а не связанный список. Спасибо, но я в курсе Тогда покажи ленивый массив. Добавлено Цитата OpenGL @ Цитата D_KEY @ Это не ленивость. Это просто range/iterator. В данном контексте это вполне можно назвать ленивым вычислением списка. Ну давай еще так назовем стандартные плюсовые итераторы ввода, например Тут же нет никакого создания списка. Ленивый список создается по мере надобности. У тебя же список создаётся только если функцию вызвать, причем создается он, опять же, целиком. Нет? |
Сообщ.
#159
,
|
|
|
Я не понимаю, что ты от меня хочешь. Я показал пример, когда бы ленивость была удобнее, и описал, что пришлось сделать из-за ее отсутствия. Причём тут массивы и создание списка целиком при вызове метода?
|
Сообщ.
#160
,
|
|
|
D_KEY, в плане примеров использования ленивых список (в частности) и ленивых вычислений вообще - могу привести свой кейс. У меня есть проект, в основе которого лежат различные операции на гиперграфе - выборка узлов, фильтрация, трансформация, сложные предикаты и прочие прелести. Понятно, что есть группа операций, в которых надо, например, обойти все связанные узлы, соответствующие некоторому критерию. А есть группа операций поиска, в которых итерации надо прерывать в момент нахождения узла. Для всего этого я и использую ленивые списки, которые ещё и в цепочки могу выстраивать с традиционными операциями map/filter/zip и т. п.
|
Сообщ.
#161
,
|
|
|
Цитата OpenGL @ Я не понимаю, что ты от меня хочешь. Я показал пример, когда бы ленивость была удобнее, и описал, что пришлось сделать из-за ее отсутствия. Ты не показал, чтобы ты сделал, если бы ленивость была Так же не объяснил, почему не сделал/не использовал реализацию ленивых структур данных для плюсов. Добавлено Цитата Flex Ferrum @ D_KEY, в плане примеров использования ленивых список (в частности) и ленивых вычислений вообще - могу привести свой кейс. У меня есть проект, в основе которого лежат различные операции на гиперграфе - выборка узлов, фильтрация, трансформация, сложные предикаты и прочие прелести. Понятно, что есть группа операций, в которых надо, например, обойти все связанные узлы, соответствующие некоторому критерию. А есть группа операций поиска, в которых итерации надо прерывать в момент нахождения узла. Для всего этого я и использую ленивые списки, которые ещё и в цепочки могу выстраивать с традиционными операциями map/filter/zip и т. п. Спасибо. Вроде да, хороший пример. Хотя если просто обойти, то разве не достаточно некоего range/iterator? Или нужно/полезно хранить предыдущие объекты, обходить несколько раз или иметь несколько ссылок на список? |
Сообщ.
#162
,
|
|
|
Цитата D_KEY @ Спасибо. Вроде да, хороший пример. Хотя если просто обойти, то разве не достаточно некоего range/iterator? Или нужно/полезно хранить предыдущие объекты, обходить несколько раз или иметь несколько ссылок на список? Там фишка в том, что могут цепочки набираться в стиле: auto GetPropertyNodes(EntityPtr entity) { return entity->GetOutgoingRelations().filter([](RelationPtr rel) {return rel->GetKind() == property;}).map([](RelationPtr rel) {return rel->GetSecondEntity();} } //... auto proertyNames = GetPropertyNodes(entity).map([](EntityPtr& entity) {return entity->GetName();}); bool hasUnnamed = std::find(propertyNames.begin(), propertyNames.end(), [](const std::string& name) {return name.empty();}) != propertyNames.end(); Добавлено В итоге, тебе известен только первый диапазон, по которому делается фильтрация. А потом один маппинг, другой, меняется тип результата, ну и т. п. |
Сообщ.
#163
,
|
|
|
Цитата D_KEY @ Ты не показал, чтобы ты сделал, если бы ленивость была Написал бы lazy. Цитата D_KEY @ Так же не объяснил, почему не сделал/не использовал реализацию ленивых структур данных для плюсов. Потому, что у меня нет привычки решать простые задачи сложными способами |
Сообщ.
#164
,
|
|
|
Цитата OpenGL @ Цитата D_KEY @ Ты не показал, чтобы ты сделал, если бы ленивость была Написал бы lazy. Куда? Цитата Цитата D_KEY @ Так же не объяснил, почему не сделал/не использовал реализацию ленивых структур данных для плюсов. Потому, что у меня нет привычки решать простые задачи сложными способами А как же Цитата Поэтому она была переписана так, чтобы она возвращала нечто, по чему можно пройтись таким вот for-ом Добавлено Цитата Flex Ferrum @ В итоге, тебе известен только первый диапазон, по которому делается фильтрация. А потом один маппинг, другой, меняется тип результата, ну и т. п. Так range это позволяют. Если тебе не нужны, условно, предыдущие элементы и результаты, то зачем их держать? Перешел в результате обхода к следующему элементу и все. Другое дело, если эти элементы нужны, будут использоваться повторно, на них имеются несколько ссылок и т.д. |
Сообщ.
#165
,
|
|
|
Цитата D_KEY @ Куда? На стену. Цитата D_KEY @ А как же Ты слишком толсто и явно троллишь. Давай тоньше |