Ищем на Ави*о по-умному
Несколько слов в строке поиска
Когда Вы вводите в поисковой форме на Авито текст состоящий из нескольких слов, то сайт выдаст все объявления, в заголовке или описании которых содержатся оба этих слова. При этом, следует иметь ввиду, что например слово «кресло» для Авито не входит в состав слова «авто кресло». Если набрать в поиске на Авито «кресло Inglesina Marco Polo», то в результаты попадут объявления, где есть слово «кресло» (пример «Автомобильное кресло inglesina marco polo 0-18»), но не попадут объявления где «автокресло» написано слитно (пример «Автокресло Inglesina Marco Polo»).К сожалению, одним запросом найти все автокресла, написанные разными способами не получится, так как в поиске на Авито не работает логика ИЛИ, т.е. найти все объявления в которых содержится хотя бы одно из заданных слов. Придется искать несколькими запросами, либо если это часто нужно, использовать возможности нашего сервиса Glisa. У нас можно задать ссылку на нужные объявления и выставить поисковые фразы с логикой ИЛИ.
Слова исключения на Авито
Если Вам нужно исключить из выдачи какие-то объявления, то на Авито можно задать слова-исключения. Для этого перед словом нужно поставить знак минус.
Можно задать достаточно большее количество минус-слов, при этом для слов-исключений также действует логика ИЛИ, т.е. объявление не будет выдаваться, если в его названии или описании присутствует хотя бы одно из этих слов.
Пример запроса: «кресло -компьютерное -мебель -коляска -качалка -кровать».Цена во всех категориях
В веб-версии Авито во многих категориях отсутствует возможность задать фильтр по цене. На самом деле это возможно. Один из вариантов как это сделать — переключиться в мобильную версию, а потом можно вернуться обратно. Для этого нужно заменить в адресе www.avito.ru на m.avito.ru и там задать фильтр по цене. С помощью обратной манипуляции можно вернуться обратно в веб-версию — в адресе добавятся необходимые параметры.
Например, в категории услуги в обычной версии нет фильтра по цене. Но с помощью данной хитрости он появится и строка запроса станет такой https://www.avito.ru/ufa/uslugi?pmax=300&pmin=0
Искать только в названиях
В мобильном приложении Авито к сожалению нет возможности установить опцию искать только в названиях. Остается только переключиться на мобильную версию, m.avito.ru. Там есть эта опция. Да и пользоваться мобильной версией удобно также как и приложением.
Пост • Хитрости экономных путешественников
В 2021 году перевозчик ООО «ВодоходЪ экспресс» запустил водный транспорт между городами южного побережья.
Росавиация утвердила перечень субсидируемых маршрутов на 2023 год. Мы в этой статье составили список субсидированных направлений всех авиакомпаний, подготовили инструкции как купить льготный билет и какие документы нужны для оформления.
Читать далее Субсидированные билеты на 2023 годСтраниц: Страница 1, Страница 2
Опубликовано Рубрики ПостМетки iFly, NordStar, Nordwind, Red Wings, S7, Smartavia, Utair, UVTaero, Азимут, Алроса, Аэрофлот, Икар, ИрАэро, КрасАвиа, РусЛайн, Субсидированные, Уральские авиалинии, Якутия, ЯмалАвиакомпания S7 предлагает своим пассажирам возможность бронировать билеты по льготному тарифу. В этом посте разбираем, в чем различия субсидированных билетов от государства и льготных от авиакомпании.
Читать далее S7 ввела льготный тариф для специальных категорий пассажиров Опубликовано Рубрики ПостМетки S7, СубсидированныеСервис «Авито Недвижимость» стремится заменить ушедший с туристического рынка Airbnb, к которому наши соотечественники успели привязаться всей душой.
Теперь на «Авито» можно бронировать жилье без опасений, что переведешь предоплату мошенникам и останешься ночевать на улице. Сдающиеся объекты тщательно проверяются экспертами «Авито Недвижимости», вы оплачиваете бронирование с помощью безопасной платформы, и ваши деньги собственник получает только после заселения.
Читать далее «Авито Недвижимость» — российский аналог Airbnb? Опубликовано Рубрики ПостМетки Airbnb, Booking, Авито НедвижимостьВ России 1 июня при поддержке Ростуризма и Министерства финансов стартовала программа бесплатных путешествий по стране для детей школьного возраста. Цель проекта — развивать познавательный туризм в рамках социального заказа.
Читать далее Ростуризм запустил программу бесплатных путешествий для школьников Опубликовано Рубрики ПостМетки кешбэк, С детьми, ЭкскурсииАвиакомпания S7 Airlines совместно с сервисом «Долями» от «Тинькофф» запустила бронирование билетов с оплатой в несколько этапов. Никаких дополнительных комиссий и процентов, просто вся сумма делится на 4 платежа.
Читать далее Билеты S7 Airlines теперь можно оплачивать частями Опубликовано Рубрики ПостМетки S7, TinkoffДрузья, мы решили поделиться нашим опытом и собрали инструкцию из четырёх простых шагов: что делать, если на интересующий вас билет цена непомерно выросла.
Авиакомпания S7 запустила абонемент для своих часто летающих пассажиров, который позволяет здорово экономить на самих билетах, багаже и питании, бесплатно выбирать место, а еще дает приоритетный доступ к распродажам компании и накапливает мили каждый месяц.
Читать далее S7 запустила абонемент с бонусами для пассажиров Опубликовано Рубрики ПостМетки S7, АбонементТуроператор будет продавать особенный продукт — железнодорожные туры по России. Экскурсионные маршруты рассчитаны как на индивидуальных туристов, так и на группы. Туроператор будет сотрудничать с частным железнодорожным перевозчиком Гранд Сервис Экспресс (ему принадлежат поезда «Таврия» в Крым и «Гранд Экспресс» между Москвой и Санкт-Петербургом).
Читать далее Гранд Экспресс Тур: новый жд туроператор Опубликовано Рубрики ПостМетки Гранд Сервис Экспресс, ТурПо постановлению Росавиации в 2021 году двенадцать российских авиакомпаний осуществляют рейсы по 269 субсидированным маршрутам. В этой статье мы составили список субсидированных направлений всех авиакомпаний, подготовили инструкции как купить льготный билет и какие документы нужны для оформления.
Читать далее Субсидированные билеты на 2021 годСтраниц: Страница 1, Страница 2
Опубликовано Рубрики ПостМетки NordStar, Nordwind, S7, Smartavia, Utair, Азимут, Алроса, Аэрофлот, ИрАэро, Субсидированные, Тарифы, Уральские авиалинии, ЯкутияПочему мы перешли с Python на Go в системе рекомендаций Авито | Василий Копытов | AvitoTech
Опубликовано в·
Чтение: 12 мин.·
2 мартаПривет! Меня зовут Василий Копытов, я руковожу группой разработки рекомендаций Авито. Мы занимаемся системами, предоставляющими пользователю персонализированную рекламу на сайте и в приложениях. На примере нашего основного сервиса я покажу, когда переходить с Python на Go, а когда оставить все как есть. В конце я дам несколько советов по оптимизации сервисов Python.
Любой, кто заходит на главную страницу сайта или приложения, видит персонализированную ленту объявлений — рекомендации. Нагрузка на наш основной рекомендательный сервис, отвечающий за генерацию бесконечной ленты объявлений на главной странице, составляет около 200 000 запросов в минуту. Общий трафик до 500 000 запросов в минуту на рекомендации.
Так выглядят рекомендации в приложении и на сайтеСервис выбирает наиболее подходящие объявления из 130 миллионов активных объявлений (элементов) для каждого пользователя. Рекомендации генерируются на основе каждого действия человека за последний месяц.
Представительство работает по следующему алгоритму:
1. Сервис обращается к хранилищу истории пользователя и извлекает из него агрегированную историю действий и интересов.
Интересы — это набор категорий и подкатегорий рекламы, которую человек недавно просматривал. Например, детская одежда, домашние животные или товары для дома.
2. Далее проходит история и интересы как набор параметров, воздействие на модели машинного обучения первого уровня.
Модели машинного обучения первого уровня являются базовыми службами. Сейчас у нас есть 4 таких модели. Они предсказывают элементы, используя различные алгоритмы машинного обучения. На выходе каждого сервиса получаем список id (рекомендуемых).
3. Мы фильтруем идентификатор на основе истории пользователя. У нас получается около 3000 элементов на пользователя.
4. И самое интересное, что представление внутри использует модель машинного обучения второго уровня, основанную на CatBoost, для ранжирования рекламы из моделей машинного обучения первого уровня в реальном времени.
5. Из данных готовим характеристики. Это параметры ранжирования рекомендаций. Для этого мы используем id элемента для получения данных в хранилище (осколочная база данных 1 ТБ, Redis). Данные товара — название, цена и еще около 50 полей.
6. Служба передает функции и элементы в модель машинного обучения второго уровня на основе библиотеки CatBoost. Результатом является ранжированная лента объявлений.
7. Далее представление выполняет бизнес-логику. Например, подбирает в ленте те объявления, за премиум размещение которых взимается плата (boost VAS).
8. Кешируем и отдаем пользователю рекомендации сгенерированного фида, в нем около 3000 объявлений.
Алгоритм формирования ленты рекомендацийПредставительство как услуга очень загружено в Авито. Он обрабатывает 200 000 запросов в минуту. Сервис стал таким не сразу: мы постоянно вносили что-то новое и улучшали качество рекомендаций. В какой-то момент он начал потреблять почти столько же ресурсов, сколько и весь остальной монолит Авито. Нам стало сложно выкатывать сервис в дневное время, в часы пик, из-за нехватки ресурсов в кластере — в это время большинство разработчиков развертывали свои сервисы.
Карта взаимодействия сервисов Авито. Размер круга показывает, сколько ресурсов кластера потребляет службаВместе с ростом потребления ресурсов росло и время отклика службы. Во время пиковых нагрузок пользователи могли ждать свои рекомендации до 1,6 секунды — это в 8 раз больше, чем за последние 2 года. Все это могло заблокировать дальнейшее развитие и совершенствование рекомендаций.
Причины этого достаточно очевидны:
- Высокая нагрузка, связанная с вводом-выводом. В представлении каждый запрос состоит примерно из 20 сопрограмм — блоков кода, которые выполняются асинхронно при обработке сетевых запросов.
- Нагрузка на ЦП от расчетов в реальном времени по ML-модели, которые полностью заняты ЦП, пока происходит ранжирование рекламы.
- GIL — представление изначально было написано на однопоточном Python. В этом языке программирования невозможно совместить рабочие нагрузки, связанные с вводом-выводом и с привязкой к ЦП, чтобы служба эффективно использовала ресурсы.
Позвольте мне рассказать вам, что помогло нам справиться с нашими нагрузками в Python.
1. ProcessPoolExecutor
ProcessPoolExecutor создает пул воркеров из процессорных ядер. Каждый воркер — это отдельный процесс, работающий на отдельном ядре. Вы можете передать нагрузку, связанную с ЦП, на рабочий процесс, чтобы он не замедлял другие процессы.
В представлении мы изначально использовали ProcessPoolExecutor для разделения рабочих нагрузок, связанных с процессором и вводом-выводом. В дополнение к основному процессу Python, который обслуживает запросы и ходит по сети (с привязкой к IO), мы выделили три воркера для ML-модели (с привязкой к CPU).
У нас есть асинхронная служба на aiohttp, которая обслуживает запросы и успешно обрабатывает нагрузку, связанную с вводом-выводом. ProcessPoolExecutor создает пул рабочих процессов. Рабочую нагрузку, связанную с ЦП, можно передать такому рабочему процессу, чтобы он не замедлял основной процесс службы и не влиял на задержку всей службы.
Выигрыш времени от использования ProcessPoolExecutor составляет около 35%. Для эксперимента мы решили сделать код синхронным и отключили ProcessPoolExecutor. То есть рабочие нагрузки, связанные с вводом-выводом и процессором, начали выполняться в одном процессе.
Без ProcessPoolExecutor время отклика увеличилось на 35%Как это выглядит в коде:
async def process_request(user_id):
# задача ввода-вывода
async with session.post(
feature_service_url,
json= {'user_id': user_id},
) as resp:
functions = await resp.json()return features
У нас есть асинхронный обработчик, который обрабатывает запрос. Для тех, кто не знаком с синтаксисом асинхронного ожидания, это ключевые слова, обозначающие точки переключения сопрограммы.
То есть на седьмой строке кода одна сопрограмма уходит в сон и отдает выполнение другой сопрограмме, которая уже получила данные, тем самым экономя процессорное время. Таким образом Python реализует совместную многозадачность.
def предсказание (функции)
preprocessed_features = процессор.препроцесс (представленный)
return model.infer(preprocessed_features)async def process_request(user_id):
# задача ввода-вывода
асинхронно с session.post(
feature_service_url,
json ={'user_id': user_id},
) as resp:
features = awat resp.json()# блокировка CPUtask
return predict(features)
Внезапно нам нужно выполнить загрузку с привязкой к ЦП из ML-модели. И так на предсказать функция наша сопрограмма заблокирует процесс python. Чтобы все сервисные запросы не стояли в очереди и время ответа сервиса не увеличивалось, как мы видели ранее.
executor = concurrent.futures.ProcessPoolExecutor(man_workers=N)def прогноз(функции):
preprocessed_features = processing.preprocess(features)
return model.infer(preprocessed_features)async def process_request(user_id):
# задача ввода/вывода
async with session. post(
feature_service_url,
json={'user_id': user_id},
) as resp:
features = await resp.json()# Неблокирующая задача ЦП
return await loop.run_in_executor(executor, predict(features))
Здесь ProcessPoolExecutor вступает в дело со своим собственным пул рабочих, который решает эту проблему. В строке 1 мы создаем пул. В конце блока кода мы берем рабочего оттуда и перемещаем задачу, связанную с процессором, на отдельное ядро. Таким образом, функция прогнозирования будет выполняться асинхронно по отношению к родительскому процессу, а не блокировать его. Приятно то, что все это будет завернуто в обычный синтаксис async-await, а задачи, привязанные к процессору, будут выполняться асинхронно, как и задачи, связанные с вводом-выводом, но под капотом будет дополнительная магия с процессами.
ProcessPoolExecutor позволил нам снизить накладные расходы от модели ML в реальном времени, но и с ним в какой-то момент стало плохо. Первое, с чего мы начали, было самым очевидным — профилированием и выявлением узких мест.
2. Профилирование службыДаже если служба написана опытными программистами, ее можно улучшить. Чтобы понять, какие части кода медленные, а какие быстрые, мы профилировали сервис с помощью профилировщика py-spy.
Профилировщик строит диаграмму, на которой горизонтальные полосы показывают, сколько процессорного времени тратится впустую на участок кода. Первое, что вы видите, это 3 полосы справа. Это всего лишь наши дочерние процессы для оценки функций модели ML.
Результат профилирования Rec-представления. Например, видно, что воркеры ProcessPoolExecutor для модели ML занимают почти одинаковое количество ресурсов ЦПНа графике пламени мы увидели некоторые интересные детали:
- 7% процессорного времени тратится на сериализацию данных между процессами. Сериализация — это преобразование данных в байты. В Python этот процесс называется pickle , а обратный — unpickle .
- 3% времени уходит на оверхед ProcessPoolExecutor — подготовка пула воркеров и распределение нагрузки между ними.
- 6,7% времени тратится на сериализацию данных для сетевых запросов в json.loads и json.dumps.
В дополнение к процентному распределению, мы хотели знать конкретное время, затрачиваемое на выполнение различных частей кода. Для этого мы снова отключили ProcessPoolExecutor, запустили модель ML для ранжирования синхронно.
Без ProcessPoolExecutor ранжирование происходит быстрее, т.к. все процессорное время занято только подготовкой фич и скорингом по ML модели, нет накладных расходов на pickle/unpickle и IO-waitНо проблема остается — конкретный кусок кода стало быстрее, но сам сервис стал медленнее.
Поэкспериментировав, мы выяснили:
- Накладные расходы ProcessPoolExecutor составляют около 100 миллисекунд.
- Запросы, связанные с вводом-выводом, от сопрограмм ждут 80 миллисекунд, то есть сопрограмма засыпает, и цикл событий снова обращается к ней через 80 мс, чтобы возобновить ее выполнение. В Representation есть три большие группы IO-bound запросов — всего на IO-wait тратится 240 миллисекунд.
Именно тогда мы впервые подумали о переходе на Go, так как он имеет более эффективную модель планирования подпрограмм из коробки.
3. Разделить рабочую нагрузку, связанную с процессором и вводом-выводом, на две отдельные службыОдним из больших изменений, которые мы пытались сделать, было удаление модели машинного обучения в отдельную службу повторного ранжирования. То есть мы сохранили наш сервис представления только с сетевыми запросами, а скоринг ML-модели был на отдельном сервисе rec-ranker, куда мы передавали все необходимые данные и возвращали скоринг для ранжирования. Казалось, что мы немного уменьшим латентность и масштабируем обе части по отдельности.
Эксперимент показал, что мы экономим время на работе модели, но получаем задержку в 270 миллисекунд при передаче данных по сети и json.loads/json.dumps. Нам нужно передать около 4 Мб на запрос, а для очень активных пользователей до 12 Мб данных для модели ML. После масштабирования rec-ranker реплики стали ненамного меньше старого представления, а время отклика не изменилось. Для нашего случая разбиение на сервисы оказалось неудачным решением, поэтому мы вернулись к предыдущей реализации Representation.
4. Оцененная общая памятьВ службе Представление данные передаются между процессами посредством pickle/unpickle. Вместо этого процессы, которые совместно используют данные, могут указывать на общую область памяти. Это экономит время сериализации.
Максимальная оценка состоит в том, что мы могли бы выиграть около 70 миллисекунд на сериализацию с таким же сокращением времени для объема выполнения запроса, поскольку загрузка ЦП блокировала основной процесс Python, который обрабатывал запросы от пользователей. Такой вывод мы сделали по профилю: pickle/unpickle занимает всего 7% процессорного времени, от разделяемой памяти особого профита не будет.
5. Подготовка фич в GoМы решили протестировать работоспособность Go сначала на части сервиса. Для эксперимента мы выбрали самую ресурсоемкую задачу в сервисе — подготовку фич.
Возможности в сервисе рекомендаций — данные о товаре и действия пользователя. Например, название объявления, цена, информация о показах и кликах. Существует около 60 параметров, влияющих на результат модели машинного обучения. То есть мы готовим все эти данные для 3000 элементов и отправляем их в модель, и она дает нам оценку для каждого элемента, которую мы используем для ранжирования фида.
Чтобы связать код Go для подготовки функций с остальной частью кода службы в Python, мы использовали ctypes.
def get_predictions(
raw_data: bytes,
model_ptr: POINTER(c_void_p),
size: int,
) -> list:
raw_predictions = lib.GetPredictionsWithModel(
GoString(raw_data, len(raw_data) )),
модель_птр,
)
прогнозы = [raw_predictions[i] для i в диапазоне (размере)]
возврат прогнозов
Вот как выглядит подготовка функций внутри Python. Модуль lib представляет собой скомпилированный пакет Go с функцией GetPredictionsWithModel. В него мы передаем байты с данными об элементах и указатели на ML-модель. Все функции подготовлены кодом Go.
Результаты были впечатляющими:
- Функции Go считаются в 20–30 раз быстрее;
- весь шаг ранжирования в 3 раза быстрее с учетом дополнительной сериализации данных в байты;
- отклик главной страницы упал на 35%.
Результаты
После всех экспериментов мы сделали четыре вывода:
- Функции Go для 3000 элементов на запрос считаются в 20–30 раз быстрее, что экономит 30% времени.
- ProcessPoolExecutor тратит впустую около 10% времени.
- Три группы запросов, связанных с вводом-выводом, занимают 25% времени пустых ожиданий.
- После перехода на Go мы сэкономим около 65% времени.
Есть модель ML в представлении-го. Естественно кажется, что ML хорош только для Python, но в нашем случае модель ML на CatBoost и у нее есть C-API, который можно вызывать из Go. Этим мы и воспользовались.
Ниже приведен фрагмент кода на Go. Не буду на этом особо останавливаться, отмечу только, что логический вывод дает те же результаты, что и в Python. C — это псевдопакет, предоставляющий Go интерфейс для библиотек C.
if !C.CalcModelPrediction(
model.Handler,
C.size_t(nSamples),
floatsC,
C.size_t(floatFeaturesCount),
CatsC,
C.size_t(categoryFeaturesCount),
(*C .двойной) (&results[0]),
C.size_t(nSamples),
) {
вернуть nil, getError()
}
Проблема в том, что модель машинного обучения все еще обучается на Python. И для того, чтобы он изучал и строил одни и те же функции, важно, чтобы они не расходились.
Мы начали их готовить по коду Go-service. Обучение происходит на отдельных машинах, туда загружается сервисный код в Go, по этому коду готовятся фичи, сохраняются в файл, затем Python-скрипт скачивает этот файл и обучает на них модель. В качестве бонуса обучение также стало в 20–30 раз быстрее.
Representation-go показал отличные результаты:
- Время отклика главной страницы сократилось в 3 раза с 1280 миллисекунд до 450 миллисекунд.
- Потребление ЦП снизилось в 5 раз.
- Потребление ОЗУ снизилось в 21 раз.
Мы разблокировали дальнейшую разработку рекомендаций — мы можем продолжать реализовывать тяжелые функции .
В нашем случае переход на Go принес желаемый результат. Основываясь на нашем опыте работы с механизмом рекомендаций, мы определили три условия, когда вам следует подумать о переходе на Go:
- сервис имеет высокую нагрузку на ЦП
- в то же время высокая нагрузка на ввод-вывод
- вам необходимо отправить большой объем данных по сети на подготовить характеристики.
Если у вас есть только рабочие нагрузки, связанные с вводом-выводом, вам лучше придерживаться Python. Переход на Go не выиграет вам много времени, вы только сэкономите ресурсы, что не так важно для малых и средних рабочих нагрузок.
Если сервис использует обе нагрузки, но не передает по сети столько данных, сколько мы, есть два варианта:
- Использовать ProcessPoolExecutor. Накладные расходы времени не будут очень большими, а обслуживание не огромным.
- Поскольку нагрузка по трафику становится слишком высокой, разделите его на 2 службы — службы с привязкой к ЦП и службы с привязкой к IO, чтобы масштабировать их отдельно.
Профилируйте свою службу. Используйте py-spy, как мы, или другой профилировщик Python. Скорее всего, ваш код не имеет огромных неоптимальных областей. Но вам нужно повнимательнее присмотреться ко всем небольшим областям, которые будут значительно улучшены. Возможно, вам не потребуется переписывать весь код.
Запустить py-spy в неблокирующем режиме:
record -F -o record. svg -s - nonblocking -p 1
Это первый флейм, который мы получили без какой-либо оптимизации. Первое, что тут бросилось в глаза, это то, что заметный кусок времени уходит на валидацию json-запроса, которая в нашем случае не очень нужна, поэтому мы ее убрали. Еще больше времени ушло на json загрузки/дампы всех сетевых запросов, поэтому мы заменили его на orjson.
В заключение несколько советов:
- Используйте валидатор запроса с умом.
- Используйте orjson для Python или jsoniter для Golang для синтаксического анализа.
- Уменьшить нагрузку на сеть — сжать данные (zstd). Оптимизация хранения базы данных, чтение/запись данных (Protobuf/MessagePack). Иногда быстрее сжимать, отправлять и распаковывать, чем отправлять несжатые данные.
- Просмотрите участки кода, выполнение которых занимает больше всего времени.
Avito — Многомиллиардный стартап, о котором вы (вероятно) никогда не слышали
Фред ДестинФред Дестин
Основатель Stride.
VC. Процветание в Хаосе.Опубликовано 23 октября 2015 г.
+ Подписаться
Avito, российская компания по размещению объявлений в Интернете, поддерживаемая Accel, — это стартап, о котором вы, возможно, никогда не слышали; это также очень особенный.
В 2007 году компания превратилась из своего рода олдскульных желтых страниц и аукционного сайта в чистую игру онлайн-объявлений к 2008 году и никогда не оглядывалась назад, став лидером во всех категориях объявлений, в которых она участвовала, от собак и кошек до недвижимости и автомобили и общие объявления.
Accel совместно с Baring Vostok возглавил инвестиционный проект на сумму 75 млн долларов и вошел в состав совета директоров в начале 2012 года. Мы рады сообщить, что Naspers приобретает контрольный пакет акций Avito в рамках знаменательной сделки , который оценивает бизнес в 2,7 миллиарда долларов. Прочтите Робина Уотерса на Tech.eu, чтобы узнать больше.
Примечание : транзакция подлежит одобрению антимонопольными органами и Южноафриканским резервным банком.
В основе успеха Avito лежит уникальная история
Сектор онлайн-объявлений является привлекательным рынком, где победитель получает все: если игрок может в 3–5 раз превысить размер второго игрока в соответствующих категориях, эта компания извлекает выгоду из эффекта снежного кома, достигая превосходной ликвидности и становясь трудной. вытеснить. Примеры включают CraigsList в США или LeBonCoin во Франции. Но несмотря на то, что существует хорошо изученный план того, что нужно для создания ведущего вертикального бизнеса объявлений, Avito получает невероятно высокие оценки за достижение лидерства как в горизонтальной, так и в вертикальной категориях: , как если бы Craigslist был объединен с Zillow и Autotrader . Уникальное и невероятное достижение.
Мы искренне благодарны за то, что были вовлечены в одну из величайших рыночных историй нашего времени, и посылаем нашу сердечную благодарность Йонасу, Филипу и всем преданным членам команды , которые сделали Avito таким ошеломляющим успехом. Поздравляем вас и Naspers!
(в соавторстве с моим партнером Сонали де Рикер, которая спонсировала эту крупную инвестицию и гордится тем, что поддерживает Team Avito)
Оценка вашего стартапа объясняется просто.
2 сентября 2020 г.
Преодоление кризиса — советы LP для врачей общей практики
6 мая 2020 г.
Условия ВК — Возвращение варваров.
17 апр. 2020 г.
Как один венчурный капиталист думает о пандемии
30 марта 2020 г.
В замешательстве — открыты ли венчурные капиталисты для бизнеса?
25 марта 2020 г.
Стартап-бренды как стратегический актив
21 февраля 2020 г.
Повысьте уровень своего мастерства по сбору средств
20 мая 2019 г.
Stride.VC — как мы работаем и к чему стремимся.
24 апр. 2019 г.
Stride.