dzz: Dizzy の冬 (Default)
dzz ([personal profile] dzz) wrote2007-06-21 11:42 am
Entry tags:

Давненько не брал я в руки шашек!

Лёгким движением руки ускорил чужой код на питоне примерно в 60 раз ;)))

Было:

rows = [] cols = [] for key in values.keys(): row, col = key if not col in cols: cols.append(col) if not row in rows: rows.append(row) n_rows = max(rows) n_cols = max(cols)
Стало:
n_rows = 0 n_cols = 0 for key in values.keys(): row, col = key if row > n_rows: n_rows = row if col > n_cols: n_cols = col


В общем, типическое "Кто так пишет..." :)))

[identity profile] david-m.livejournal.com 2007-06-21 09:07 am (UTC)(link)
Да ужъ.

[identity profile] dzz.livejournal.com 2007-06-21 09:59 am (UTC)(link)
Такое впечатление, что народ забыл простейшие алгоритмические фокусы и дядьку Кнута не читал :)

[identity profile] mike-mihalych.livejournal.com 2007-06-22 02:56 am (UTC)(link)
Его вообще мало кто читал.

[identity profile] dzz.livejournal.com 2007-06-22 05:58 am (UTC)(link)
Среди моих друзей - довольно многие читали. Хотя, конечно, читали в другие времена - ещё до эры ВизуальногоПрограммизматм :)
nine_k: A stream of colors expanding from brain (Default)

[personal profile] nine_k 2007-06-22 10:24 pm (UTC)(link)
Мало того: не думает, что именно он написал.
Вот, например, зачем в исходном варианте первый цикл, я ваще не понимаю. Это люди про zip() не знают, наверное. (Впрочем, алгоритмически лучше код от этого становится ненамного).

Кстати, можно и ещё сэкономить на построении (длинных) списков, пользуясь iterkeys().

[identity profile] scheddi.livejournal.com 2007-06-21 11:07 am (UTC)(link)
Гм... до первого варианта еще додуматься надо :) я тоже такую траву хочу!

[identity profile] dzz.livejournal.com 2007-06-21 02:58 pm (UTC)(link)
Ну, это всё равно не дотягивает до алгоритма определения чётности, попавшегося мне на глаза в далёком детстве:

for (i=0, j=1; i<value; i++) j *= -1;
if (j>0) printf("Чётное"); else printf("Нечётное");

:)))

[identity profile] scheddi.livejournal.com 2007-06-21 03:35 pm (UTC)(link)
ну... это еще осознать надо :)
пару раз я видела - и даже пыталась модифицировать программы, в которых код такой, что поневоле начинаешь задумываться о смысле жизни :)

[identity profile] dzz.livejournal.com 2007-06-22 06:01 am (UTC)(link)
Ну, тут основная идея - цикл от 0 до проверяемого числа.
Для достаточно больших чисел - весьма долго.

Хотя, в действительности, достаточно проверить остаток от деления на 2, он же - младший бит :)))

[identity profile] scheddi.livejournal.com 2007-06-22 08:41 am (UTC)(link)
Да про цикл я поняла... непонятно другое - как это вообще может в голову прийти :) И в предыдущем примерчике - аналогично.

[identity profile] dzz.livejournal.com 2007-06-22 10:50 am (UTC)(link)
Природа извращений - штука загадочная :)

(Anonymous) 2007-06-23 10:51 am (UTC)(link)
Мне рассказали про то, как у кого-то увидели алгоритм определения названия месяца. На каком языке, я не спросил, поэтому приведу паскалевский аналог того, что мне описали:

  if value = 1 then result := 'январь'
  else if value = 2 then result := 'февраль'

И так далее до 12. Автор про массивы, похоже, не слышал.

(Anonymous) 2007-06-23 10:41 am (UTC)(link)
А если value равно, например, 3,234634634E+45 или 7,43524395847523489E+20?
Может, сразу, ввести определение, что все числа, после некого, чётные?
Иначе пользователь алгоримта удавится ждать результата.

[identity profile] dzz.livejournal.com 2007-06-23 01:01 pm (UTC)(link)
> Иначе пользователь алгоритма удавится ждать результата.

Дык, в этом-то и вся прелесть :)

[identity profile] dzz.livejournal.com 2007-06-23 01:13 pm (UTC)(link)
Разумеется, числа вида 3,234634634E+45 будут по определению чётными, т.к. разрядность мантиссы МЕНЬШЕ 45 знаков, т.е. в конце имеется энное количество нулей.

Речь, всё же, идёт о числах меньше maxint :)