Негодная реализация NList.Concat
От: Ka3a4oK  
Дата: 30.07.10 15:22
Оценка: 16 (1)
Пытался понять почему тормозит программа, в итоге нашел проблему в очень неожиданном месте — функция NList.Concat. Она работает ужасающее медленно. Моя реализация, которая работает достаточно быстро приведена ниже:


MyConcatRev[T] (l:list [list [T]]):list[T]
{
    NList.FoldLeft(l, [], NList.FoldLeft(_, _, _::_))
}

MyConcat[T] (l:list [list [T]]):list[T]
{
    NList.Rev(MyConcatRev(l))
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re: Негодная реализация NList.Concat
От: Ka3a4oK  
Дата: 30.07.10 15:26
Оценка:
В догонку... Было бы неплохо провести ревизию билиотечного кода на предмет подобных засад.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re: Негодная реализация NList.Concat
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.07.10 15:58
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Пытался понять почему тормозит программа, в итоге нашел проблему в очень неожиданном месте — функция NList.Concat. Она работает ужасающее медленно. Моя реализация, которая работает достаточно быстро приведена ниже:


Откровенно говоря списки конкатенировать (в узких местах программы) вообще нельзя. Если появляется такая необходимость, то лучше взять SCG.List[T] и в конце преобразовать результат в список (если надо).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Негодная реализация NList.Concat
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.07.10 16:08
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Пытался понять почему тормозит программа, в итоге нашел проблему в очень неожиданном месте — функция NList.Concat. Она работает ужасающее медленно. Моя реализация, которая работает достаточно быстро приведена ниже:


Народ, зокомитьте кто-нить. И проверьте есть ли тесты для этой функции.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Негодная реализация NList.Concat
От: Ka3a4oK  
Дата: 30.07.10 17:51
Оценка:
VD>Откровенно говоря списки конкатенировать (в узких местах программы) вообще нельзя. Если появляется такая необходимость, то лучше взять SCG.List[T] и в конце преобразовать результат в список (если надо).

Я на коленке собрал алгоритм, который бы по текстовому файлу строил его словарь -> лексиграфически упорядоченый список токенов.

Я сделал так:


def ReadFileStringByString():list[string]
{
    ...
}

NList.RemoveDuplicates
(    NList.Sort
    (    NList.Map
        (    NList.Concat
            (    NList.Map
                (    ReadFileStringByString(),    
                    TokenizeString(_, char.IsLetterOrDigit)
                )
            ),
            _.ToLower()
        ),
    string.Compare
    )
);


Мне не нужна была максимальная скорость, иначе бы я использовал С++. Но я хотел добиться приемлемой скорости, ибо каждый раз ждать по несколько минут пока обработается какой-то жалкий десяток мегабайт -- это бездарная трата времени. То что получилось не лезло ни в какие ворота.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[3]: Негодная реализация NList.Concat
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.07.10 18:43
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Я на коленке собрал алгоритм, который бы по текстовому файлу строил его словарь -> лексиграфически упорядоченый список токенов.


KK>Я сделал так:

KK>

KK>NList.RemoveDuplicates...Sort...Map...Concat...Map...
KK>


KK>Мне не нужна была максимальная скорость, иначе бы я использовал С++.


Плюсы тут ровным счетом ничего не дадут. При правильной реализации все урпется в винт.

Я бы для данной задачи воспользовался бы хэш-таблицей или вообще линковским Distinct-том, а он уже сам бы hesh-Set использовал бы.

KK> Но я хотел добиться приемлемой скорости, ибо каждый раз ждать по несколько минут пока обработается какой-то жалкий десяток мегабайт -- это бездарная трата времени. То что получилось не лезло ни в какие ворота.


Ну, тогда списки тебе попросту не нужны. Или преобразуй к ним уже готовую последовательность.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Негодная реализация NList.Concat
От: Ka3a4oK  
Дата: 30.07.10 18:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Ka3a4oK, Вы писали:


KK>>Я на коленке собрал алгоритм, который бы по текстовому файлу строил его словарь -> лексиграфически упорядоченый список токенов.


KK>>Я сделал так:

KK>>

KK>>NList.RemoveDuplicates...Sort...Map...Concat...Map...
KK>>


KK>>Мне не нужна была максимальная скорость, иначе бы я использовал С++.


VD>Плюсы тут ровным счетом ничего не дадут. При правильной реализации все урпется в винт.


VD>Я бы для данной задачи воспользовался бы хэш-таблицей или вообще линковским Distinct-том, а он уже сам бы hesh-Set использовал бы.


Hash не сортирует. В итоге все это потом опять сливать в последовательность из сортиовать.


KK>> Но я хотел добиться приемлемой скорости, ибо каждый раз ждать по несколько минут пока обработается какой-то жалкий десяток мегабайт -- это бездарная трата времени. То что получилось не лезло ни в какие ворота.


VD>Ну, тогда списки тебе попросту не нужны. Или преобразуй к ним уже готовую последовательность.


Не понял. Почему не нужны? А что нужно?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[4]: Негодная реализация NList.Concat
От: Ka3a4oK  
Дата: 30.07.10 19:06
Оценка:
Просто мне непонятно, почему Concat тут не к месту — это лишь O(n) операция(как и остальные Map-ы в алгоритме), тогда как сортировка, без которой не обойтись — это O(n*log(n)).
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[5]: Негодная реализация NList.Concat
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.07.10 21:43
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Hash не сортирует. В итоге все это потом опять сливать в последовательность из сортиовать.


Ну, и что? Это копейки.

KK>Не понял. Почему не нужны? А что нужно?


Я уже сказал, что проще всего просто вызвать Distinct, а потом OrderBy, если надо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Негодная реализация NList.Concat
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.07.10 21:45
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Просто мне непонятно, почему Concat тут не к месту — это лишь O(n) операция(как и остальные Map-ы в алгоритме), тогда как сортировка, без которой не обойтись — это O(n*log(n)).


А зачем здесь она? У тебя какая задача? Получить список уникальных значений и отсортировать его (как я понял). Ну, так и надо ее решать самыми простыми средствами. Все хорошо к месту.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Негодная реализация NList.Concat
От: _nn_ www.nemerleweb.com
Дата: 01.08.10 05:33
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Ka3a4oK, Вы писали:


KK>>Пытался понять почему тормозит программа, в итоге нашел проблему в очень неожиданном месте — функция NList.Concat. Она работает ужасающее медленно. Моя реализация, которая работает достаточно быстро приведена ниже:


VD>Народ, зокомитьте кто-нить. И проверьте есть ли тесты для этой функции.


Стоит ли ConcatRev выносить в публичный доступ ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Негодная реализация NList.Concat
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.08.10 16:25
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Стоит ли ConcatRev выносить в публичный доступ ?


Стоит. Там где порядок не важен он позволит ускорить алгоритм. К тому же прецеденты есть (MapRev).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Негодная реализация NList.Concat
От: Ka3a4oK  
Дата: 01.08.10 19:44
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, _nn_, Вы писали:


__>>Стоит ли ConcatRev выносить в публичный доступ ?


VD>Стоит. Там где порядок не важен он позволит ускорить алгоритм. К тому же прецеденты есть (MapRev).


Может в подобныее методы добавить дополнительный параметр со значением по-умолчанию. Что-то типа:

Map(..., KeepOrder:bool=true)
Concat(..., KeepOrder:bool=true)


Старый код при этом скомпилируется.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[2]: Негодная реализация NList.Concat
От: Klapaucius  
Дата: 02.08.10 11:33
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>В догонку... Было бы неплохо провести ревизию билиотечного кода на предмет подобных засад.


Такие работы запланированы и ведутся. Пожелания по стандартной библиотеке принимаются здесь
Автор: Klapaucius
Дата: 28.07.10
.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[4]: Негодная реализация NList.Concat
От: catbert  
Дата: 03.08.10 08:37
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Стоит. Там где порядок не важен он позволит ускорить алгоритм. К тому же прецеденты есть (MapRev).


Ну, в данном случае ConcatRev == Concat |> Rev.
Re[5]: Негодная реализация NList.Concat
От: catbert  
Дата: 03.08.10 08:43
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Может в подобныее методы добавить дополнительный параметр со значением по-умолчанию.


Такое изменение стоит проверить профайлером на предмет тормозов. Ведь эти методы часто используются, а опциональные параметры как-никак добавляют еще одну степень свободы при разрешении перегрузок.
Re[5]: Негодная реализация NList.Concat
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.08.10 17:17
Оценка:
Здравствуйте, catbert, Вы писали:

VD>>Стоит. Там где порядок не важен он позволит ускорить алгоритм. К тому же прецеденты есть (MapRev).


C>Ну, в данном случае ConcatRev == Concat |> Rev.


Все с точностью до наоборот. ConcatRev можно реализовать эффективно, а уже Concat реализовать через него и Rev.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.