Сообщения в Python и магия генераторов

Python и магия генераторов

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

Эффективность обработки также играет для меня роль, так как впоследствии наработанные подходы я наверняка буду пытаться применять и для больших объёмов данных.
Andrew Lobanov to All (2019-07-24 06:21:25) [ссылка]

Re: Python и магия генераторов

Ответ на сообщение
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)}
Если предложите вариант проще и быстрее, то буду рад.
Andrew Lobanov to All (2019-07-24 08:18:41) [ссылка]

Re: Python и магия генераторов

Ответ на сообщение
> Я её хочу обработать минимальным количеством кода
В тему, что меня бесит -- это питоновые однострочники. Оно работает не быстрее, чем если ты запишешь это в несколько строк,
а вот читаемость падает.
Difrex to Andrew Lobanov (2019-07-24 13:37:26) [ссылка]

Re: Python и магия генераторов

Ответ на сообщение
>> Я её хочу обработать минимальным количеством кода
Difrex> В тему, что меня бесит -- это питоновые однострочники. Оно работает не быстрее, чем если ты запишешь это в несколько строк,
Difrex> а вот читаемость падает.
А мне наоборот компактность кажется читаемее. По крайней мере в генераторах. К тому же зачастую генератор получается быстрее циклического создания списка или словаря, вроде. Но это вкусовщина, конечно.
Andrew Lobanov to Difrex (2019-07-25 04:33:30) [ссылка]

Re: Python и магия генераторов

Ответ на сообщение
>> Я её хочу обработать минимальным количеством кода
Difrex> В тему, что меня бесит -- это питоновые однострочники. Оно работает не быстрее, чем если ты запишешь это в несколько строк,
Difrex> а вот читаемость падает.
Кстати, в итоге сделал вот так вообще. Даёт небольшой прирост в скорости и по идее легче читается.
d = {}
for (key, vaule) in re.findall("(.+):(.+)\n", counts):
    d[key] = value
Кстати, насколько я понял, регулярки в re ложатся в философию питона как родные и всегда есть возможность получить или список или итератор. Или баловаться со смещением в цикле, что навряд ли будет быстро.

Я правильно думаю, что нет простого способа просто следующее совпадение извлечь?
Andrew Lobanov to Difrex (2019-07-25 04:33:32) [ссылка]

Re: Python и магия генераторов

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

Скомпиль, кстати, регулярку сначала, будет еще быстрее
r = re.compile("(.+):(.+)\n")
Difrex to Andrew Lobanov (2019-07-25 06:12:11) [ссылка]

Re: Python и магия генераторов

Ответ на сообщение
>> Я правильно думаю, что нет простого способа просто следующее совпадение извлечь?
Difrex> Ага, нету.
Понятно. И даже ожидаемо, так как оно немного противоречит философии питона, насколько я её понимаю =)
Difrex> Скомпиль, кстати, регулярку сначала, будет еще быстрее
Difrex> ====
Difrex> r = re.compile("(.+):(.+)\n")
Difrex> ====
Как раз поигрался вчера с этим немного и собирался в ближайшее время коммитнуть это изменение. Спасибо.
Andrew Lobanov to Difrex (2019-07-25 07:52:33) [ссылка]