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

по вопросам сюда: @aigul_sea
Download Telegram
📌Помимо #spark, также буду вести рубрики #sql_tips, #python_tips, возможно, что-то еще по мере появления идей. Там будут лайфхаки, о которых я узнала на рабочих задачах или во время чтения книжек📖

Например, про временные таблицы

Это один из способов оптимизации запросов. Если разбить один длинный запрос на несколько временных таблиц, то он будет работать быстрее за счет минимизации повторных вычислений. Например, если нужно переиспользовать результат или если из-за джойнов сильно разрастается количество строк.

В MS SQL Server есть два вида: локальные (#) и глобальные (##):

CREATE TABLE #localTempTable (...)

CREATE TABLE ##globalTempTable (...)


Локальные доступны только для вашего пользователя и удаляются при закрытии сессии. Глобальные доступны всем и живут, пока жива хотя бы одна использующая их сессия.

На временные таблицы также можно навешивать индексы🗂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥763
Объявление переменных Python🐍 vs Scala🏔

Если мы хотим объявить несколько переменных в одной строке, на Python это будет так:
a, b = 'a', 1.1


На Scala нужно добавить ключевое слово val/var и обрамить скобочками:
val (a, b) = ("a", 1.1)


Для удобства можно указать типы полей:
val (a:String, b:Double) = ("a", 1.1)


val - неизменяемый, от слова "value"
var - изменяемый, от слова "variable"

По возможности старайтесь использовать константы, это:
понижает риски появления багов
повышает читаемость кода
позволяет оптимизироваться под капотом, зная, что значения меняться не будут

В Scala есть еще одна интересность - lazy val.
val выполняется, когда мы создали переменную.
lazy val выполняется, когда мы впервые обратились к этой переменной.
Если мы никогда до нее не доберемся, то ресурсы тратится не будут💳

#python_tips #scala_tips
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥95💯1
🎁Распаковка переменных

У нас есть список, кортеж, что угодно, и нам нужно достать оттуда элементы:
person = (
'Eveline',
(1990, 12, 31),
'Moscow',
'+79271111111',
'+79272222222'
)

# Вместо того, чтобы обращаться по индексу:
name, birth_date, city, phone1, phone2 = person[0], person[1], person[2], person[3], person[4]

# можем сразу распаковать вот так:
name, birth_date, city, phone1, phone2 = person


Тогда в name пойдет имя, в birth_date - дата рождения и т.д.
Самое главное - количество переменных слева и элементов в объекте справа должно совпадать.

💫Хотелки
# Хочу скипнуть некоторые поля:
name, _, city, phone1, _ = person

# Хочу сложить телефоны в список:
name, birth_date, city, *phone_list = person
# список может идти в начале и середине тоже

# Хочу взять имя и phone2:
name, *_, phone2 = person

# Хочу взять только имя:
name, *_ = person

# Хочу взять только phone2:
*_, phone2 = person

# Хочу взять имя и год рождения:
name, (year, *_), *_ = person


#python_tips
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1821
Спасибо Алексею за полное и лаконичное пояснение 🧡, а я добавлю еще пояснялку с замерами по памяти



Я взяла тестовый файлик с 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
А вы знали, что в питоне так можно?

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

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