дата инженеретта – Telegram
дата инженеретта
2.98K subscribers
242 photos
28 videos
4 files
102 links
мелкое — крупно,
в глубоком разговоре
мудрость приходит

по вопросам сюда: @aigul_sea
Download Telegram
Про генераторы и итераторы

Мне когда-то советовали прочитать книжку Лутца по питону, но я ее забросила. Теперь мне нечего было делать, и я снова решила к ней вернуться) И тут я как осознала!

📝 Сделаем одно упражнение. Возьмем список, отберем только четные числа двумя способами:

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 - продолжили


🌀 Прикол в том, что у range итераторов может быть много, как будто они передаются по значению. А в остальных случаях как будто по ссылке - когда изменяется одна, изменяется и другая.

По сути в тех случаях, когда нам не нужно несколько раз обращаться к одним данным, мы спокойно можем использовать генератор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍268🔥8
Какой способ/ы выполнятся быстрее?
Anonymous Poll
42%
for line in f.readlines():
41%
for line in f:
👍2
Крутые дата-каналы 🔥

Собрали тут с ребятами мини-папку с дата-каналами. У меня в телеге под 200 полезных каналов, что я уже выделила папку "cool" для лучших из лучших ❤️

В ней лежит больше половины из дата-папки, и я их частенько почитываю. Сейчас добавила оставшиеся, так что точно рекомендую и вам это сделать 🔥

https://news.1rj.ru/str/addlist/a1B07iwrPxUxNWIy
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥83👍2
Forwarded from Алексей
for line in f:

Использует итерацию по файлу построчно, без загрузки всего файла в память.
Самый быстрый и экономичный способ по памяти, особенно для больших файлов.

for line in f.read()::

Читает весь файл целиком в память как одну строку, а затем проходит по символам, а не по строкам. Это значительно замедляет работу и требует больше памяти.

for line in f.readlines()::

Читает весь файл в память как список строк. Это быстрее, чем f.read(), но всё ещё требует загрузки всего файла в память.

верно рассуждаю?
👍143
Спасибо Алексею за полное и лаконичное пояснение 🧡, а я добавлю еще пояснялку с замерами по памяти



Я взяла тестовый файлик с 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


🔶Результаты🔶

🟣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
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍218🔥3
я популярити

мой первый доклад по де в таком масштабе💺
уже нагенерила идеи, данные и скрипт, сегодня доделываю презу и потом пойду репать спич 😥
даже на почту эта рассылка пришла!
Please open Telegram to view this post
VIEW IN TELEGRAM
19🔥5
Forwarded from Simulative
🧑‍💻 Вебинар: Собираем витрину данных, как в бигтехе, от описания до результата

Представьте, что вы тренер футбольной команды. И у вас есть витрина данных, которая собирает информацию о каждом игроке, включая количество забитых голов, ассистов, время на поле и количество проведенных матчей. Такая витрина помогает выявить слабые места в команде и сфокусироваться на их улучшении.

О том, как аналитику строить витрину данных, разберём в прямом эфире на примере реальной задачи 28 января в 19:00 по МСК. Спикер вебинара — Айгуль Сибгатуллина, Data Engineer в Сбер, автор телеграм-канала @data_engineerette.

Вебинар пройдёт в нашем любимом режиме «решение тестового задания» — представим, что мы владельцы бизнеса, и на практическом примере покажем, зачем и почему мы это делаем.

Что будет:
🟠 Построение воркфлоу от этапа получения ТЗ до создания полноценной витрины;
🟠 Какие инструменты нужны для дата-инженера;
🟠 Как разобраться с методологией на разных диалектах;
🟠 Как объединить данные из нескольких источников;
🟠 Spark в работе дата-инженера: преобразования и оптимизации;
🟠 Как AI может ускорить процессы.

➡️ Зарегистрироваться
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥51👍1312🦄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👍82
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
👍14🔥5
А вы знали, что в питоне так можно?

Собрала несколько кейсов, о которых вы могли даже не подозревать:

1️⃣ Имя функции - это переменная, и этому имени мы можем присвоить что угодно:

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


Естественно, после переопределения все предыдущие возможности перестают действовать

2️⃣ Та же история с модулями:

import math

type(math)
# <class 'module'>

math = -1

type(math)
# <class 'int'>


3️⃣ При импорте модулей существующие переменные перезаписываются:

x = 2

from mymodule import x

print(x)
# 'new_value'


4️⃣ А переменные после цикла остаются существовать:

for i in range(2):
print(i)

print(i) # 2


#python_tips
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2012👍7🌚5👀3😁2🎄1