# Python и магия генераторов
Andrew Lobanov(tavern,1) — All
2019-07-24 07:21:25


Продолжаю учиться писать программы на питоне и возник один странный, может быть, вопрос. Есть строка, в которой хранится в "сыром" виде выхлопом x/c. То есть данные в виде

echo.area:messages_count

Я её хочу обработать минимальным количеством кода. Так что решил использовать генератор:

{x.split(":")[0]: x.split(":")[1] for x in x_i.split("\n") if ":" in x}

Но при этом мне очень не нравится дважды вызванный .split(":"). Можно как-то произвести сплит единожды для каждой итерации или придётся городить огород для этого?

Эффективность обработки также играет для меня роль, так как впоследствии наработанные подходы я наверняка буду пытаться применять и для больших объёмов данных.

# Re: Python и магия генераторов
Andrew Lobanov(tavern,1) — All
2019-07-24 09:18:41


AL> Продолжаю учиться писать программы на питоне и возник один странный, может быть, вопрос. Есть строка, в которой хранится в "сыром" виде выхлопом x/c. То есть данные в виде
AL> ====
AL> echo.area:messages_count
AL> ====
AL> Я её хочу обработать минимальным количеством кода. Так что решил использовать генератор:
AL> ====
AL> {x.split(":")[0]: x.split(":")[1] for x in x_i.split("\n") if ":" in x}
AL> ====
AL> Но при этом мне очень не нравится дважды вызванный .split(":"). Можно как-то произвести сплит единожды для каждой итерации или придётся городить огород для этого?

Благодаря товарищам из Instead группы в ТГ решил это следующим образом:

{y[0]: int(y[1]) for y in (x.split(":") for x in counts.split("\n") if ":" in x)}

Если предложите вариант проще и быстрее, то буду рад.

# Re: Python и магия генераторов
Difrex(dynamic,1) — Andrew Lobanov
2019-07-24 14:37:26


> Я её хочу обработать минимальным количеством кода
В тему, что меня бесит -- это питоновые однострочники. Оно работает не быстрее, чем если ты запишешь это в несколько строк,
а вот читаемость падает.

# Re: Python и магия генераторов
Andrew Lobanov(tavern,1) — Difrex
2019-07-25 05:33:30


>> Я её хочу обработать минимальным количеством кода
Difrex> В тему, что меня бесит -- это питоновые однострочники. Оно работает не быстрее, чем если ты запишешь это в несколько строк,
Difrex> а вот читаемость падает.

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

# Re: Python и магия генераторов
Andrew Lobanov(tavern,1) — Difrex
2019-07-25 05:33:32


>> Я её хочу обработать минимальным количеством кода
Difrex> В тему, что меня бесит -- это питоновые однострочники. Оно работает не быстрее, чем если ты запишешь это в несколько строк,
Difrex> а вот читаемость падает.

Кстати, в итоге сделал вот так вообще. Даёт небольшой прирост в скорости и по идее легче читается.

d = {}
for (key, vaule) in re.findall("(.+):(.+)\n", counts):
    d[key] = value

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

Я правильно думаю, что нет простого способа просто следующее совпадение извлечь?

# Re: Python и магия генераторов
Difrex(dynamic,1) — Andrew Lobanov
2019-07-25 07:12:11


> Я правильно думаю, что нет простого способа просто следующее совпадение извлечь?
Ага, нету.

Скомпиль, кстати, регулярку сначала, будет еще быстрее
r = re.compile("(.+):(.+)\n")

# Re: Python и магия генераторов
Andrew Lobanov(tavern,1) — Difrex
2019-07-25 08:52:33


>> Я правильно думаю, что нет простого способа просто следующее совпадение извлечь?
Difrex> Ага, нету.

Понятно. И даже ожидаемо, так как оно немного противоречит философии питона, насколько я её понимаю =)

Difrex> Скомпиль, кстати, регулярку сначала, будет еще быстрее
Difrex> ====
Difrex> r = re.compile("(.+):(.+)\n")
Difrex> ====

Как раз поигрался вчера с этим немного и собирался в ближайшее время коммитнуть это изменение. Спасибо.