Например, про временные таблицы
Это один из способов оптимизации запросов. Если разбить один длинный запрос на несколько временных таблиц, то он будет работать быстрее за счет минимизации повторных вычислений. Например, если нужно переиспользовать результат или если из-за джойнов сильно разрастается количество строк.
В MS SQL Server есть два вида: локальные (#) и глобальные (##):
CREATE TABLE #localTempTable (...)
CREATE TABLE ##globalTempTable (...)
Локальные доступны только для вашего пользователя и удаляются при закрытии сессии. Глобальные доступны всем и живут, пока жива хотя бы одна использующая их сессия.
На временные таблицы также можно навешивать индексы🗂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤6⚡3
Объявление переменных Python🐍 vs Scala🏔
Если мы хотим объявить несколько переменных в одной строке, на Python это будет так:
На Scala нужно добавить ключевое слово val/var и обрамить скобочками:
Для удобства можно указать типы полей:
val - неизменяемый, от слова "value"
var - изменяемый, от слова "variable"
По возможности старайтесь использовать константы, это:
✅ понижает риски появления багов
✅ повышает читаемость кода
✅ позволяет оптимизироваться под капотом, зная, что значения меняться не будут
В Scala есть еще одна интересность - lazy val.
val выполняется, когда мы создали переменную.
lazy val выполняется, когда мы впервые обратились к этой переменной.
Если мы никогда до нее не доберемся, то ресурсы тратится не будут💳
#python_tips #scala_tips
Если мы хотим объявить несколько переменных в одной строке, на 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
🔥9❤5💯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
🔥18❤2⚡1
Спасибо Алексею за полное и лаконичное пояснение 🧡 , а я добавлю еще пояснялку с замерами по памяти
➖ ➖
Я взяла тестовый файлик с 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
А вы знали, что в питоне так можно?
Собрала несколько кейсов, о которых вы могли даже не подозревать:
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