Аналитесса-разработчица👩🏻‍💻💅🏻
3.6K subscribers
609 photos
2 videos
1 file
264 links
Я Аня, data analyst @ Dwelly
ex-Yandex, T-Bank, Ozon, Avito Tech Platform

Тут про айти, новости ИИ и немного лайфстайла🌆

Digital nomad без определённого города жительства🛩
Посетила 49 стран

dm: @nechka266 💌
личное: @analytess_live
Download Telegram
Почему круто работать в командах с необычным доменом😎

Недавно писала о том, как выбирать работу, если хочется расти в продуктовой аналитике наиболее прямым путём. Но, как вы могли заметить, я сама им не следую😐 (Вот, где я работаю)

Поэтому сегодня расскажу, какие есть плюсы в таком раскладе.

1️⃣ Во-первых, это просто интересно👍
Можно узнать штуки и практики, о которых никогда не задумывался. Что вообще под капотом у поисковой системы, кто и как решает, что окажется в выдаче по вашему запросу, как определяют и фиксят инциденты на проде разрабы Авито...

2️⃣ Можно применить свои скиллы на стыке профессий🤵
Я училась в бакалавриате на программного инженера. Это не значит, что я могу и хочу стать сейчас бэкендером, но мне нравится идея, что информация про API, цикл разработки ПО, нефункциональные требования релевантна на текущем месте.

У свитчеров, которые до IT работали в какой-то другой области, тоже может быть подобная фора — можно выбрать бизнес или команду, где вы уже понимаете больше, чем аналитик, который погружается по стандартному процессу в новый для себя домен.

3️⃣ Кругозор — это тоже полезно🌎
Как известно, в любой области знаний можно расти в «ширину» или в «глубину». Да, я не провела сотню A/B-тестов в одном и том же продукте, не знаю всех подводных камушков в платформе и историю всех продуктовых гипотез за пару лет, но...

Я потрогала своими руками краудсорсинг, знаю, какие задачи можно и нельзя поручить LLM, знаю, как можно связать чисто технические на первый взгляд процессы с предсказанием временных рядов, знаю, какие есть варианты организации DWH в разных местах... Это тоже своего рода моя сильная сторона💪

➡️ Да, где-то всё ещё есть та самая «классическая продуктовая аналитика», а я — всё ещё не там. Но, может быть, так и надо?

А вы что думаете? Необычные домены — норм или стрём?😏

#найм_и_собесы #карьерный_совет #непопулярное_мнение
@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
25🔥18🦄146🙏1
Приближается весна☀️
а вместе с ней — сезон стажировок

Пост об этом будет явно не один, и сегодня я начну с разбора некоторых тезисов о стажёрских программах бигтехов, в обсуждении которых недавно поучаствовала в одном чате🌟

Disclaimer: сегодня разберём перспективы без розовых очков😏

Стажировка — это не «настоящий» опыт для трудовой 🤵

➡️ Действительно, оказывается, существует практика оформления стажёров по ГПХ. Но базово «стажёр» это просто грейд, название должности, а не отдельный тип договора (в отличие от практики на предприятии для вуза, например). Оплачиваемые стажировки в бигтехах чаще всего оформляются как срочный трудовой договор от 3 до 12 месяцев, и это полноценная работа, которая считается в стаж.

Ага, то есть через 3-6-12 месяцев меня могут выгнать «на мороз», а где гарантии трудоустройства?

➡️ Есть две новости: плохая и тоже плохая😬 Никто не даст гарантию, что для вас найдётся место в штате (обычно, когда её дают, это какой-нибудь ученический договор с отработкой, можете погуглить Aston, и люди потом наоборот ищут способы освободиться). К сожалению, команды в бигтехах реально далеко не всегда могут предсказать наличие и количество вакансий через полгода, особенно на джуновский грейд.

Чуть позже разберу отдельно, как повысить вероятность остаться в компании после стажировки, а пока вот вам мой кейс.
В январе 2020 года (это важно!) я вышла стажёром-аналитиком в Яндекс Поиск, и к тому моменту знала, что есть базово три варианта — 🤍ты плохо работаешь, и остаться не предлагают, 🤍ты хорошо работаешь и становишься джуном, 🤍ты хорошо работаешь, но уходишь доучиваться спокойно.
А вот к июлю 2020 года дефолтным вариантом стало увольнение при любом фидбеке, потому что времена изменились😷

То, что моя стажировка прошла хорошо, доказывается тем, что в мае 2021 я вернулась в ту же команду, где проработала три года. Но конкретно тогда сделать было ничего нельзя…

Примерно в том же году в Яндексе постепенно появился вариант после стажировки выйти на первый мидловский грейд, но массовым стал не сразу. И так далее. Это всё к тому, что сейчас ситуация в айтишке очень изменчива, и загадывать нельзя.

Некруто быть стажёром целый год: получается, мне будут недоплачивать, если я через 3 месяца уже всему научусь?

➡️ Работа авансом на следующий грейд — это база, давайте скажем честно😄 Между джуном/мидлом/мидлом+ ещё можно джобхопнуть, а в начале пути и наоборот по пути к сеньору, или же просто во времена рынка работодателя, уже релевантнее рост внутри. И повышение, когда вы уже примерно полгода (это один период ревью) работали на следующий грейд — звучит вполне нормально. Грустно, когда не по вашей вине оно задерживается сильнее, но это уже другой разговор…

Кстати, ровно чтобы не эксплуатировать стажёров вместо мидлов, в том же 📱 не продлевают стажировки, а всего их может быть две (условно, после 3 и 4 курса, а потом в штат).

Кроме того, опыт — это не только общие харды и локальные штуки вроде подключения к базам данных конкретной компании, но и некоторая насмотренность на продукт и best practices старших коллег, а также софты. А через 3-6 месяцев у вас скорее всего будет только первая часть, если объективно.

➡️ Скажите честно, мой рассказ о стажировках вас не совсем демотивировал? Нужен ли отдельный пост про плюсы?🥰

#найм_и_собесы #карьерный_путь
@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
12418🔥107🤷‍♀1💅1
Бесполезная лингвистическая заметка😏

Лежу такая пару дней назад, пытаюсь уснуть, и тут у меня мысль:
а почему квантúль женского рода, а перцентúль мужского?!

Очевидно, что эти слова построены одинаково, но я об этом никогда так не думала, встречая их в разных контекстах...

Погуглила, мой вопрос сменился на:
а почему меня учили на 2 курсе, что квантúль женского рода?

Я это помню очень отчётливо, про ударение на И для меня уже тогда был инсайт (и я вижу в опросе, что кто-то говорит квáнтиль, но меньшинство), но препод подчеркивала и род.
Видимо, 23 (на момент написания этой фразы) проголосовавших за квантúль женского рода учились там же🤓

Словари однозначно говорят, что слово мужского рода, причём слово перцентиль даже первичнее, а квантиль его как бы обобщило спустя 55 лет. При этом, хочу отметить, что само по себе окончание слова -иль в русском языке не говорит о роде слова — мужской чаще, но ваниль и кадриль тоже существуют...

А вот если загуглить целенаправленно «выборочная квантиль», то уже находятся и учебники, и лекции, где это слово употребляется ровно так. А ещё часто в заголовках оно просто в множественном числе и вопрос не встаёт. Окак😐

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

@analytess 👩

💋 Закончу я этот пост шуткой от своего друга (не аналитика):
Please open Telegram to view this post
VIEW IN TELEGRAM
36🔥1162
Основы O-оценки сложности для алгособесов📈

Постараюсь ввести вас в курс дела как аналитиков, потому что любое Leetcode-собеседование (а их становится больше) подразумевает если не совсем оптимальное решение, то что кандидат хотя бы понимает, как это измеряется🤵

➡️ Что это вообще такое?
Big-O («О большое») — это асимптотическая* оценка того, c какой скоростью растут время и/или память алгоритма при увеличении размера входных данных, если отбросить константы
* для подробностей нужно определение предела, не сегодня

Время в данном случае — это количество простейших операций (что-нибудь сложить, умножить, присвоить), память — количество переменных, которое приходится хранить (например, во вспомогательных массивах), размер входа — сколько данных нам дано. Например, даётся один массив чисел — его длину мы обозначаем за N. Может быть задача, где каждый элемент входного массива уже не просто число, а, например, строка длины не более M, и это тоже окажется важно...

➡️ Основные правила оценки сложности вашего кода
Учим, как аксиомы:
⚪️ Любые фиксированные присвоения переменных (например, инициализация какой-нибудь суммы или указателей-индексов) — это константная сложность O(1)
⚪️ Линейный проход по всем элементам массива — O(N)
⚪️ Сортировка — O(N log N), если встроенная и оптимальная, но иногда доходит до O(N^2) (это уже другая история)
⚪️ Вложенные циклы: сложности перемножаются. Если у вас 2 вложенных for i in arr, где arr — ваш входной массив длины N, то будет O(N^2), если 3 — то O(N^3), и так далее...

Если массива два, то будет O(N * M), пример:
for i in range(len(arr_1)): # arr_1 - массив длины N
for j in range(len(arr_2)): # arr_2 - массив длины M
...


⚪️ У последовательных шагов сложности складываются, но более быстрорастущее слагаемое поглощает остальные. То есть, если у вас сначала один цикл обработки массива, а потом 2 вложенных, то в пределе не O(N^2) + O(N), а просто O(N^2).

Если циклы не вложенные по двум массивам, то мы оставляем O(N + M), потому что не можем сравнить N и M асимптотически.

➡️ Быстрый порядок величин «от лучше к хуже»:
O(1) < O(log N) < O(N) < O(N log N) < O(N²) < O(2^N) < O(N!)

До последних двух мы стараемся не доходить в задачах на собесах, это нереально много операций. Например, задача рандомной перестановки элементов массива не подразумевает, что вы сгенерируете все N! штук, сохраните их и выберете.

➡️ Библиотечные методы и структуры тоже учитываются
Они оптимизированы по мере возможности, но та же сортировка никогда не станет линейной😬 Продвинутый уровень — выучить, что оптимально для какой операции.

➡️ Пример фразы, которая растопит сердце интервьюера😎
Тут получается сложность O(N) за счёт линейного поиска по массиву, инициализация переменных была за O(1). Могу написать бинпоиск, будет оптимальнее — за O(log N)...

Особенно, если вы реально понимаете, почему так работает))

Буду ждать фидбек, стало ли понятнее👍 И пересылайте друзьям, которые собираются на стажировки и другие собесы!

#хардов_пост #найм_и_собесы
@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3116115👍1
Про интровертных айтишников и нетворкинг😎

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

➡️ С одной стороны, есть люди, которым тяжеловато подойти к кому-то и заговорить. А может быть, и просто не особо хочется — бесплатный фуршет интереснее (0% осуждения, сама бываю на этом месте иногда). С другой стороны, нетворкинг может быть и чересчур нарочитым и активным, и это тоже что-то не то🚨

Например, я думаю, что напечатать и раздавать свои визитки — это действительно крутой способ запомниться, если вы предлагаете людям что-то конкретное. Но не просто подписаться на вас, потому что вы классный (но вас видят в первый раз, поэтому пруфов не будет😄). А если вы пока не знаете, что предложить, то можно начать с малого...

➡️ Есть такая книжка: «Никогда не ешьте в одиночку». Не стоит это высказывание понимать буквально, если обед для вас — это единственная возможность выдохнуть между встречами и побыть одному. Но тем не менее, я верю в то, что именно во время неформальных посиделок с коллегами можно узнать что-то интересное, что не говорится на встречах в зуме.

А так — посмотрите хотя бы основные тезисы в вики, мне кажется, что они релевантны для большинства из нас🌟
Я думаю, основная мысль там в том, что отношения и связи строятся заранее, а не когда уже срочно нужны.

В целом я бы начинала нетворкать следующим образом:
⭐️ позовите пообедать или за кофе коллегу, который вам интересен, даже если в команде нет такой традиции. Именно ланч или короткий кофе — это тот тип встречи, который возможен даже с занятым человеком, но при этом может положить начало чего-то бóльшего. Кстати, можно так поступать с бывшими коллегами (особенно, если офисы неподалёку))
⭐️ запишитесь на random coffee, если встретите такое предложение. Эти боты часто есть в айти-компаниях и разного рода чатах☕️ Обычно вам будут назначать одну пару в неделю, но фактически вряд ли вы всегда будете договариваться, так что это ненапряжная активность. А иногда бывает прямо мэтч🤝
⭐️ улыбайтесь, искренне интересуйтесь собеседником (задавайте вопросы в ответ и т.д.), поблагодарите за беседу и проговорите, если можете быть полезны чем-то в будущем👍

😘 Хочу вам признаться — я считаю себя интровертом, как и положено айтишнику (нет)😐 И это не мешает нетворкать, общаться в чатах, вести блог, просто после времени в компании мне требуется чуть больше тишины и отдыха в одиночестве🎧

➡️ А вам легко даётся нетворкинг? Были ли забавные кейсы?

#непопулярное_мнение
@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
2317🔥95👍1
московский золотой час & вид из офиса Авито👍

к сожалению, не сегодня, но всё равно может вас замотивирует)

@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰32🔥17972💔1
Меня прожарили по A/B по стандартам жёлтого банка🌟⚡️
(и нет, это не собеседование было. А пост — не рекламный)

Короче, мой знакомый Рома Филев (который против FOMO) прямо сейчас активно работает над форматом собеседований аналитиков и DS в Т-Банке, но все могут прикоснуться к их методам оценки — так я сходила на экзамен по A/B-тестам💊

Вы уже знаете, что A/B-тесты — чуть больная для меня тема.
Я ни на одной из своих big tech работ не погружалась в какие-то треш-кейсы, где всё пошло не так, потому что тест был неправильно спроектирован кем-то в jupyter notebook на коленке, который уже не воспроизводится, а продакт не шарит и требует остановить через 2 дня, и вот это вот всё😄

То есть это как бы слабое звено моего опыта, но я в последний год наконец-то стала уверена, что теорию выучила хорошо (потом обсудим, как). И поэтому мне было очень интересно мнение со стороны, основанное на чём-то сложнее, чем вопросы «что такое p-value» и «откуда берётся MDE».

За полтора часа мы с коллегой Ромы разобрали в телемосте три кейса по модели «найди, что тут пошло не так, и как сделать лучше». Успели поговорить достаточно подробно о нюансах выбора метрик, проектирования сложных экспериментов (например, с ML-моделью). Вскоре я получила фидбек с объяснениями, где конкретно я затупила, почему не 10😎

Я даже честно с вами поделюсь этими моментами:
➡️ не знала про одну популярную фишку для ускорения теста,
➡️ в кейсе с ML чутка зациклилась на технических штуках, тогда как ожидалось, что я выловлю бизнесовую проблему (кстати, это мэтчится с некоторыми моими провалами на собесах в прошлом)
➡️ можно глубже шарить за вариации CUPED и сетевые эффекты

Вывод: отлично, работаем дальше!👍
Я на своём примере по сути показываю, что не обязательно провести сотни тестов в компании без платформы, чтобы понять достаточно для найма. А так, всегда есть куда стремиться📈

#жизнь_в_бигтехах
@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
437👍13🔥11💅85🥰1
Что внутри у GPT? Объяснение на 200 строк кода на питоне🐍

В последний, примерно, год часто чувствую в себе потребность по возможности успевать разбираться в современном машинном обучении чуть больше, чем на уровне «ну, LLM просто предсказывает наиболее вероятное слово» (хоть это и не так далеко от истины). Хотя бы для того, чтобы не быть совсем уж диванным аналитиком, когда высказываюсь скептически по поводу замены нас AI (мне иногда за такое предъявляют)😄

Признаюсь, во время учёбы я не очень любила ML и даже NLP, несмотря на мой некоторый интерес к лингвистике в целом. Закрывала базу на лабах, но не прочувствовала, что ли? Сейчас это кажется некоторым упущением, но так бывает, теперь читаю объяснения на стыке с научпопом и годные приношу вам🌟

И вот мне скинули прикольную статью на Хабре — точнее, перевод заметки из блога Андрея Карпаты (ориг на английском).
➡️ Проект microgpt — это буквально алгоритмические основы GPT без библиотек, на чистом Python. Всё остальное — уже вопрос эффективности и работы с большими наборами данных.

Плохая новость для кого-то может быть разве что в том, что без градиентов (высшей математики) там всё равно не обошлось. А так получился весь базовый цикл обучения: выбор документа и токенизация -> проход модели по токенам -> вычисление функции потерь -> обратное распространение (через градиенты) -> обновление параметров 📈

«Настоящая» LLM вроде ChatGPT отличается, собственно, тем, что она Large. Вместо 32 тысяч коротких имён она обучается на триллионах токенов текста из интернета — всевозможных веб-страниц, книг, кода и всего такого. Также используются более оптимальные алгоритмы на последующих шагах, а количество параметров модели больше на порядки. Ну, и сервера...

А вот понимает ли даже самая большая модель что-нибудь на самом деле — пожалуй, останется вопросом философским🤨
➡️ Кстати, вы какую точку зрения выбрали для себя?

#хардов_пост #аналитика_и_жизнь
@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥30🆒1572
Мама, я в телевизоре
Обожаю коллабы с классными коллегами по блогерству💗
Please open Telegram to view this post
VIEW IN TELEGRAM
11🥰64
Media is too big
VIEW IN TELEGRAM
Если в 11 ночи вам скучно и вы не спите - мы всегда рады предложить вам варианты того, как убить пару часов.
Мы продолжаем снимать серию N вопросов и выкладывать ее в наших соцсетях с видеоконтентом. Хотите поучаствовать - пишите @positivedespair!

📸 В кадре наша любимая Аналитесса💕
Please open Telegram to view this post
VIEW IN TELEGRAM
12211🥰3💅2
Разрешите помечтать⭐️

За длинные выходные в Барселоне я поняла, что у меня всё очень даже, но для полного счастья не хватает пары вещей...

➡️ я хочу, чтобы плохая связь вызывала у меня не негатив от того, что фотки в телегу не грузятся, а реакцию «окей, убираю телефон на три часика и опубликую всё потом из старбакса»

➡️ в целом, как будто, надо больше наслаждаться моментом и отпускать мысли о повседневном, когда я в каком-то красивом месте. Тут не знаю, может это нейроотличность какая-то, не все в принципе понимают, о чём я, когда спрашиваю, как у них😄

➡️ я хочу жить в месте, где зимой тепло🥲 и уметь радоваться снежной дюне, как радовались европейцы из моего автобуса на границе с Андоррой, потому что видят такое раз в год!

➡️ ну и 30 часов в сутках было бы неплохо😀 высыпаться пока что никак не получается, потому что работаю я по Москве (встаю в 7 Белграда, чтобы начать), а гуляю до вечера по европейскому времени. В Барселоне это было особенно выражено, учитывая дорогу и то, что я ездила за город с утра...

Хорошая новость в том, что я могу на 3 из 4 факторов влиять. Так что пусть это будут мои запоздалые 2026 resolutions👍

А у вас как дела, что новенького?🥰
Больше моментов из путешествия — всё ещё в @analytess_live

@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1💅1587💘5💔1🙈1
💗💗💗💗💗 🌻 💗💗💗💗💗💗
а пока — зимний дайджест

🌎 путешествия
«всего-то» 9 перелётов — я думала, будет больше. но вот впечатлений куча, и самые яркие, конечно, от Мадейры🌴

сейчас я в Белграде, тут тепло и классно. дальше тоже всё расписано, в Москве в ближайшее время буду бывать мало😐

💻 работа
я прошла зимнее performance review в Авито, это оказалось вполне себе нестрашно. уже получила заслуженную премию на карточку и подробную обратную связь о том, что было хорошо, а в чём мне стоит продолжать расти, чтобы стать в обозримом будущем настоящим синером (спойлер — это софты)

много думала о карьере в целом, о стратегии, которой у меня в явном виде сейчас нет, но тем не менее можно научиться оценивать, какие решения двигают скорее куда надо, а какие — скорее в тупик. буду об этом рассказывать подробнее! stay tuned
(думаю, скоро я смогу вас порадовать контентом, пупупу😄)

✍️ блог
отметила свои 3000 подписчиков, хоть и вышла на некоторое плато по росту — нет возможности так активно светиться везде, как раньше, ищу новые форматы продвижения, открыта к коллабам с другими (заглядывайте в личку @nechka266)😏
с приятным удивлением обнаружила себя в рейтинге NEWHR📈

темой-хэдлайнером сезона в канале, по моим субъективным ощущениям, стало развитие ИИ, новости об этом и мои попытки сформировать актуальное и аргументированное мнение:
➡️ доклад с конференции про безопасность ИИ-агентов
➡️ навайбкодила за час карту своих перелётов по миру
➡️ что вытворяет в интернете ваш ИИ-агент, пока вы спите
➡️ что внутри у GPT? показываем за 200 строк на Python

другие прикольные посты, которые вы могли пропустить👍
➡️ важные факты про A/B-тестирование для собесов
➡️ ML для аналитика: нужно ли + подборка курсов
➡️ планируем год без насилия над собой (ещё не поздно)
➡️ что такое продуктовая аналитика здорового человека
➡️ О-оценка сложности алгоритмов для чайников
➡️ как меня прожарили по A/B-тестам в стиле Т-Банка

спасибо, что вы со мной! давайте радоваться весеннему увеличению светового дня и вместе достигать целей😎⭐️

#лайфстайл_и_личное
@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
131108💅61
Разбор популярной задачи уровня Leetcode Medium из бигтехов😎

Я знаю 4 компании из tier 1-2, где её давали на собесах в разных вариациях, поэтому пост обещает быть полезным. Погнали🚀

Более того, я хочу не просто показать вам код, а описать путь к оптимальному решению, каким он может быть на реальном собеседовании (см. пост про алгоритмическую сложность).

Пусть дан массив пар с городами и их населением, например:
[['Kaliningrad', 488690], ['Sochi', 445149], ['Kolomna', 213701]]

Вывести случайный город с вероятностью, пропорциональной населению.


1️⃣ Интуиция: давайте положим в корзину 488690 бумажек с надписью «Калининград», 445149 — с надписью «Сочи», 213701 — с надписью «Коломна», и вытянем случайную из них.
Это ровно то, что требуется сделать по условию, и чисто технически мы действительно могли бы создать такой огромный список строк (но не set) с названиями городов, и выбирать случайную.

2️⃣ А надо ли тратить столько памяти (пожалейте деревья😬)?
Окей, давайте заметим, что можно сэмплить случайное число между 1 и суммой значений в словаре. Если выпало от 1 до 488690, то возвращаем Калининград, от 488691 до 488690 + 445149 — Сочи, от 488691 + 445150 до 488690 + 445149 + 213701 — Коломну. Мы избавились от вспомогательного массива, который мог бы оказаться большим.

3️⃣ Тем не менее, а если городов очень много, удобно ли работать с такими большими целыми? Давайте нормируем так, чтобы сумма всех жителей упомянутых городов равнялась 1.0 — это лучше соответствует определению вероятности в принципе, а работа с float достаточно точная на практике. Делим всё на 488690 + 445149 + 213701 и вызываем функцию для случайного числа на полуинтервале [0, 1) — в питоне это random.random().

Опишем алгоритмически: за один проход по массиву (O(N), где N — количество городов) мы формируем массив кумулятивных сумм вероятностей выпадения каждого города:
cur = 0.0
sums = []
total = sum([city[1] for city in cities])
for city in cities:
sums.append(cur)
cur += city[1] / total
assert cur == 1.0 # должно сойтись по построению

# print(sums)
# [0.0, 0.4258587935932516, 0.8137746832354428]


Далее вызываем рандомное действительное число и ищем слева направо первый элемент массива sums, который больше него. Тогда ответ — предыдущий город🌇
r = random.random()
for i in range(len(sums)):
if r < sums[i]:
return cities[i - 1][0]
return cities[-1][0]

Выхода за границу массива слева не будет из-за строгого <, а последний return отвечает за случай r == 1.0 (вообще такого не бывает, но чтобы точно собеседующий был доволен).

Это ещё один проход по массиву размера N (aka линейный поиск), то есть сложность алгоритма O(N) + O(N) = O(N).

4️⃣🌟 Высший пилотаж: доводим до оптимального решения📈
Выше я не просто так упомянула сложность каждого из шагов.

Вторая часть может быть оптимизирована до O(log N), если линейный поиск заменить на бинарный. Это можно сделать, так как выполнено основное требование — массив кумулятивных сумм вероятностей является отсортированным по построению.

Теперь заметим, что по сути первое действие достаточно сделать всего один раз, а не каждый раз при вызове функции выбора случайного города (вызывать её будут много раз, раз речь зашла о распределении). Тогда можно вместо функции написать класс, где эта часть будет вынесена в __init__, а основной метод sample() будет быстрее.

Это в целом хорошая практика — выносить предвычисления из основного метода, так как за много вызовов sample() один целый проход по массиву амортизируется («размазывается» по всем вызовам).

➡️ Итоговый код приложу в комментарии! Как вам такой формат?

И голосуйте: 🤓 — если переслал другу, который ищет работу, 👩 — слишком сложно, до свидания, 🦄 — наконец-то понятно, спасибо

#найм_и_собесы #хардов_пост
@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
242🦄24125🔥5👍42🆒1
мемная пауза, или учимся вести линкед ин у котиков👍

1️⃣
😏 реальность: сделала вид, что не ела, хотя уже ела.
🖇 в резюме: выявила возможность перераспределения ресурсов на основе неполных исторических данных, что привело к возобновлению обсуждений по снекам.

2️⃣
😏 реальность: выпросила еду у менее строгого из хозяев.
🖇 в резюме: использовала знания о стейкхолдерах, чтобы определить более гибкое лицо, принимающее решения, что улучшило показатели получения снеков.

➡️ уверенно говорим «да, было»? (кстати, добавляйтесь на линке)

@analytess 👩
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
14919💅11