@drrsanPy

Как ускорить метод users.get?

Есть данная функция:
def get_users(user_id):
    friends = session.method("friends.get", {"user_id": user_id})
    for friend in friends["items"]:
        user = session.method("users.get", {"user_ids": friend})

        print(f"{user[0]['first_name']} {user[0]['last_name']} - {user[0]['id']}")
        user_id2 = {user[0]['id']}

        try:
            friends1 = session.method("friends.get", {"user_id": user_id2})
            for friend2 in friends1["items"]:
                user2 = session.method("users.get", {"user_ids": friend2})
                print(f"| {user2[0]['first_name']} {user2[0]['last_name']} - {user2[0]['id']}")
        except:
            print("private")

Как сделать, чтобы друзья появлялись быстрей? Библиотека - vk-api
  • Вопрос задан
  • 146 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Вся проблема у вас из-за того, что вы тут делаете много http-запросов к API. Это в любом случае будет не быстро.
Вам нужно изучить API на предмет bulk-запросов, когда вы извлекаете сразу много записей одним http-запросом к API.
На сколько я понимаю, друзей может быть очень много, а вы идёте в глубину на два яруса, что имеет квадратичную сложность. То есть если у всех в среднем 10 друзей, то вы сделаете по десять запросов на каждого из десяти дррузей, что очень долго - 100 запросов!

Для начала вы можете кэшировать полученные от API данные, чтобы повторно не получать одни и те же, если есть общие друзья. Нужно найти bulk-методы в API и правильно их использовать (если они есть).

Ещё можно построить работу с такими операциями на асинхронных механизмах, воркерах и тасках. Долгие запросы с кэшированием должны делать специальные воркеры - отдельные процессы, которым скидываются задания через очередь. По факту выполнения ими возвращаются результаты, или кладутся в локальную БД. Это позволит не блокировать основной поток выполнения программы на такие долгие операции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы