@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
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Вся проблема у вас из-за того, что вы тут делаете много http-запросов к API. Это в любом случае будет не быстро.
Вам нужно изучить API на предмет bulk-запросов, когда вы извлекаете сразу много записей одним http-запросом к API.
На сколько я понимаю, друзей может быть очень много, а вы идёте в глубину на два яруса, что имеет квадратичную сложность. То есть если у всех в среднем 10 друзей, то вы сделаете по десять запросов на каждого из десяти дррузей, что очень долго - 100 запросов!

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

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

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

Войти через центр авторизации
Похожие вопросы