Про генераторы и итераторы
Мне когда-то советовали прочитать книжку Лутца по питону, но я ее забросила. Теперь мне нечего было делать, и я снова решила к ней вернуться) И тут я как осознала!
📝 Сделаем одно упражнение. Возьмем список, отберем только четные числа двумя способами:
А теперь дважды материализуем:
Список хранит все в памяти, занимает оперативку, и мы можем его вызывать сколько угодно раз.
А генератор закончился и всегда будет пустым🔲
➖ ➖ ➖ ➖
Если мы попробуем сделать то же самое ручками, то есть еще интересный нюанс.
Сделаем два итератора - для функции range и нашего генератора l2. Сначала вызовем первый, потом второй:
🌀 Прикол в том, что у range итераторов может быть много, как будто они передаются по значению. А в остальных случаях как будто по ссылке - когда изменяется одна, изменяется и другая.
По сути в тех случаях, когда нам не нужно несколько раз обращаться к одним данным, мы спокойно можем использовать генератор✅
Мне когда-то советовали прочитать книжку Лутца по питону, но я ее забросила. Теперь мне нечего было делать, и я снова решила к ней вернуться) И тут я как осознала!
lst = [1, 2, 3, 4]
l1 = [x for x in lst if x % 2 == 0]
l2 = (x for x in lst if x % 2 == 0)
print(type(l1))
# <class 'list'>
print(type(l2))
# <class 'generator'>
А теперь дважды материализуем:
print(list(l1))
print(list(l1))
# [2, 4]
# [2, 4]
print(list(l2))
print(list(l2))
# [2, 4]
# []
Список хранит все в памяти, занимает оперативку, и мы можем его вызывать сколько угодно раз.
А генератор закончился и всегда будет пустым
Если мы попробуем сделать то же самое ручками, то есть еще интересный нюанс.
Сделаем два итератора - для функции range и нашего генератора l2. Сначала вызовем первый, потом второй:
r = range(2)
i1 = iter(r)
i2 = iter(r)
print(next(i1))
# 0
print(next(i2))
# 0 - заново
l2 = (x for x in lst if x % 2 == 0)
i1 = iter(l2)
i2 = iter(l2)
print(next(i1))
# 2
print(next(i2))
# 4 - продолжили
По сути в тех случаях, когда нам не нужно несколько раз обращаться к одним данным, мы спокойно можем использовать генератор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤8🔥8
Какой способ/ы выполнятся быстрее?
Anonymous Poll
23%
for line in f.read():
42%
for line in f.readlines():
41%
for line in f:
👍2
Крутые дата-каналы 🔥
Собрали тут с ребятами мини-папку с дата-каналами. У меня в телеге под 200 полезных каналов, что я уже выделила папку "cool" для лучших из лучших❤️
В ней лежит больше половины из дата-папки, и я их частенько почитываю. Сейчас добавила оставшиеся, так что точно рекомендую и вам это сделать🔥
https://news.1rj.ru/str/addlist/a1B07iwrPxUxNWIy
Собрали тут с ребятами мини-папку с дата-каналами. У меня в телеге под 200 полезных каналов, что я уже выделила папку "cool" для лучших из лучших
В ней лежит больше половины из дата-папки, и я их частенько почитываю. Сейчас добавила оставшиеся, так что точно рекомендую и вам это сделать
https://news.1rj.ru/str/addlist/a1B07iwrPxUxNWIy
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
data party
Айлин invites you to add the folder “data party”, which includes 8 chats.
1🔥8 3👍2
Forwarded from Алексей
for line in f:
Использует итерацию по файлу построчно, без загрузки всего файла в память.
Самый быстрый и экономичный способ по памяти, особенно для больших файлов.
for line in f.read()::
Читает весь файл целиком в память как одну строку, а затем проходит по символам, а не по строкам. Это значительно замедляет работу и требует больше памяти.
for line in f.readlines()::
Читает весь файл в память как список строк. Это быстрее, чем f.read(), но всё ещё требует загрузки всего файла в память.
верно рассуждаю?
Использует итерацию по файлу построчно, без загрузки всего файла в память.
Самый быстрый и экономичный способ по памяти, особенно для больших файлов.
for line in f.read()::
Читает весь файл целиком в память как одну строку, а затем проходит по символам, а не по строкам. Это значительно замедляет работу и требует больше памяти.
for line in f.readlines()::
Читает весь файл в память как список строк. Это быстрее, чем f.read(), но всё ещё требует загрузки всего файла в память.
верно рассуждаю?
👍14❤3
Спасибо Алексею за полное и лаконичное пояснение 🧡 , а я добавлю еще пояснялку с замерами по памяти
➖ ➖
Я взяла тестовый файлик с 1 млн строк и протестила все функции на нем по типу такого:
🔶 Результаты🔶
🟣 read()
<class 'str'>
123 793 263 - длина строки
123 793 312 - размер в байтах
🟣 readlines()
<class 'list'>
1 000 001 - количество строк (+заголовок)
8 448 728 - размер в байтах
🟣 файловый итератор
<class '_io.TextIOWrapper'>
208 - размер в байтах
➡️ Получилось, что на выборке в 1 млн строк c длиной ~ 200 символов выигрыш по памяти между списком и итератором составил в 40k раз
➖ ➖
Если мы попробуем сделать такую же штуку с list(range(1000000)) vs range(1000000), то получим нечто похожее:
🟣 list(range(1000000))
<class 'list'>
1 000 000 - количество чисел
8 000 056 - размер в байтах
🟣 range(1000000)
<class 'range'>
1000000 - количество чисел
48 - размер в байтах
➡️ Тут с чиселками выигрыш в 166k раз
Вот и думайте
#python_tips
Я взяла тестовый файлик с 1 млн строк и протестила все функции на нем по типу такого:
import sys
with open('1000000 Sales Records.csv') as f:
f_list = f.readlines()
print(type(f_list))
print(len(f_list))
print(sys.getsizeof(f_list)) # in bytes
<class 'str'>
123 793 263 - длина строки
123 793 312 - размер в байтах
<class 'list'>
1 000 001 - количество строк (+заголовок)
8 448 728 - размер в байтах
<class '_io.TextIOWrapper'>
208 - размер в байтах
Если мы попробуем сделать такую же штуку с list(range(1000000)) vs range(1000000), то получим нечто похожее:
<class 'list'>
1 000 000 - количество чисел
8 000 056 - размер в байтах
<class 'range'>
1000000 - количество чисел
48 - размер в байтах
Вот и думайте
#python_tips
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍21 8🔥3
Никто еще не попробовал эту штуку в dbt?
https://www.getdbt.com/blog/dbt-labs-acquires-sdf-labs
https://www.sdf.com/
https://www.getdbt.com/blog/dbt-labs-acquires-sdf-labs
https://www.sdf.com/
dbt Labs
dbt Labs acquires SDF Labs to advance analytics engineering | dbt Labs
dbt Labs has acquired SDF Labs to enhance analytics engineering solutions. Learn how this partnership strengthens the modern data stack.
👍5
я популярити
мой первый доклад по де в таком масштабе💺
уже нагенерила идеи, данные и скрипт, сегодня доделываю презу и потом пойду репать спич😥
даже на почту эта рассылка пришла!
мой первый доклад по де в таком масштабе
уже нагенерила идеи, данные и скрипт, сегодня доделываю презу и потом пойду репать спич
даже на почту эта рассылка пришла!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤19🔥5
Forwarded from Simulative
🧑💻 Вебинар: Собираем витрину данных, как в бигтехе, от описания до результата
Представьте, что вы тренер футбольной команды. И у вас есть витрина данных, которая собирает информацию о каждом игроке, включая количество забитых голов, ассистов, время на поле и количество проведенных матчей. Такая витрина помогает выявить слабые места в команде и сфокусироваться на их улучшении.
О том, как аналитику строить витрину данных, разберём в прямом эфире на примере реальной задачи 28 января в 19:00 по МСК. Спикер вебинара — Айгуль Сибгатуллина, Data Engineer в Сбер, автор телеграм-канала @data_engineerette.
Вебинар пройдёт в нашем любимом режиме «решение тестового задания» — представим, что мы владельцы бизнеса, и на практическом примере покажем, зачем и почему мы это делаем.
Что будет:
🟠 Построение воркфлоу от этапа получения ТЗ до создания полноценной витрины;
🟠 Какие инструменты нужны для дата-инженера;
🟠 Как разобраться с методологией на разных диалектах;
🟠 Как объединить данные из нескольких источников;
🟠 Spark в работе дата-инженера: преобразования и оптимизации;
🟠 Как AI может ускорить процессы.
➡️ Зарегистрироваться
Представьте, что вы тренер футбольной команды. И у вас есть витрина данных, которая собирает информацию о каждом игроке, включая количество забитых голов, ассистов, время на поле и количество проведенных матчей. Такая витрина помогает выявить слабые места в команде и сфокусироваться на их улучшении.
О том, как аналитику строить витрину данных, разберём в прямом эфире на примере реальной задачи 28 января в 19:00 по МСК. Спикер вебинара — Айгуль Сибгатуллина, Data Engineer в Сбер, автор телеграм-канала @data_engineerette.
Вебинар пройдёт в нашем любимом режиме «решение тестового задания» — представим, что мы владельцы бизнеса, и на практическом примере покажем, зачем и почему мы это делаем.
Что будет:
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥51👍13❤12🦄2
Выложила запись на ютуб
Но у меня ни таймкоды не подтянулись, ни ссылки не работают
Спасибо всем, кто пришел! Меня ваши сердечки и огонечки очень подбадривали
Немного статистики: 400 человек в пике, 600 в тотале!
Ссылка на материалы: https://github.com/Aigul9/spark-webinar
Please open Telegram to view this post
VIEW IN TELEGRAM
❤53🔥25👍10
Please open Telegram to view this post
VIEW IN TELEGRAM
🤷25😁22🌚10🤔9👍8❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Решения всех ваших проблем 🙌
Вчера на ретро с командой накидали решения проблем, перетасовали, а потом выбирали подходящие стикеры, как в игре с мемами. И вот что у нас получилось⬆️
Можете в комментах поделиться, что вам советует судьба на этот раз
Вчера на ретро с командой накидали решения проблем, перетасовали, а потом выбирали подходящие стикеры, как в игре с мемами. И вот что у нас получилось
Можете в комментах поделиться, что вам советует судьба на этот раз
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14🔥10👍2
Посмотрела вчерашний митап, вот еще картиночки архитектур
По сути это классическое двх, data lake и data lakehouse
Но вам не кажется, что кх поверх гринплам - немножко многовато, тем более в lakehouse?
#system_design
По сути это классическое двх, data lake и data lakehouse
Но вам не кажется, что кх поверх гринплам - немножко многовато, тем более в lakehouse?
#system_design
👍14🔥5
А вы знали, что в питоне так можно?
Собрала несколько кейсов, о которых вы могли даже не подозревать:
1️⃣ Имя функции - это переменная, и этому имени мы можем присвоить что угодно:
Естественно, после переопределения все предыдущие возможности перестают действовать
2️⃣ Та же история с модулями:
3️⃣ При импорте модулей существующие переменные перезаписываются:
4️⃣ А переменные после цикла остаются существовать:
#python_tips
Собрала несколько кейсов, о которых вы могли даже не подозревать:
def func():
print('hi')
func()
# hi
func = -1
func()
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: 'int' object is not callable
Естественно, после переопределения все предыдущие возможности перестают действовать
import math
type(math)
# <class 'module'>
math = -1
type(math)
# <class 'int'>
x = 2
from mymodule import x
print(x)
# 'new_value'
for i in range(2):
print(i)
print(i) # 2
#python_tips
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20 12👍7🌚5👀3😁2🎄1
Про качество данных
В конце прошлого года я зачитывалась книжками. И в одной из них мне понравилось выражение, что данные - это "тихий убийца".
Мы можем даже не понимать, что они некачественные, но в какой-то момент это выстрелит.
😭 Был кейс, когда одна команда сделала финансовую отчетность на основе некорректных данных и направила куда-то выше. В этой отчетности цифры были сильно меньше, чем потратили. И встал вопрос - а куда делись все остальные средства? Так что это может довести до серьезных последствий.
❤️🩹 А вообще качество данных - это очень хрупкая вещь.
Где может пойти не так?
▶️ при выгрузке из источника (поставили лишний фильтр)
▶️ при передаче между системами (все задублировалось, потеряли куски информации)
▶️ при интеграции нескольких источников (не на все данные прописаны правила сопоставления)
▶️ при анализе (неправильно посчитали)
А это очень милая и грустная аномалия в контексте целостности данных:
▶️ сироты - когда внешние ключи никуда не ведут
#data_dmbok #fundamentals_of_de
В конце прошлого года я зачитывалась книжками. И в одной из них мне понравилось выражение, что данные - это "тихий убийца".
Мы можем даже не понимать, что они некачественные, но в какой-то момент это выстрелит.
Где может пойти не так?
А это очень милая и грустная аномалия в контексте целостности данных:
Каждый, кто прикасается к данным, способен повлиять на их качество. Обеспечение качества данных — предмет заботы всей организации, а не только команды качества данных или ИТ.
Руководство данными нужно для того, чтобы «делать правильные вещи» (Doing the right things), а управление данными — для того, чтобы «делать вещи правильно» (Doing things right)
#data_dmbok #fundamentals_of_de
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35🔥11👀6😁1