#python #python_3x #vkontakte_api #инспекция_кода
Как ускорить данный код? В среднем работа занимает около 4 минут на группу в 300 человек. Мне кажется дело в занесении групп в словарь. Есть ли какой-то более рациональный способ сделать это? Данный код берет всех подписчиков определенной группы (в данном случае fineline_official), затем у каждого подписчика проверяет в каких группах он состоит groups = api.users.getSubscriptions(user_id = mid)['groups']. Затем добавляет в словарь id этих групп. Если в словаре нет id какой-либо группы, то он добавляет ее туда groups_dict[gid] = 1. Если же id этой группы уже есть в словаре, то прибавляет 1 к значению ключа. На входе получаем группу (id), на выходе 10 самых популярных групп среди подписчиков данной группы import vk session = vk.Session(access_token='token') #VK token api = vk.API(session) group_id = 'fineline_official' #group id group_stat=api.groups.getMembers(group_id = group_id ) #Получаем участников группы members_id = group_stat['users'] members_count = group_stat['count'] groups_dict = {} if members_count <= 1000: for mid in members_id: try: groups = api.users.getSubscriptions(user_id = mid)['groups'] groups_id = groups['items'] for gid in groups_id: try: groups_dict[gid] groups_dict[gid] += 1 except: groups_dict[gid] = 1 except: continue else: print('>1000') lst = [] for k in groups_dict.items(): #Добавление в список кортеж из id группы и кол-ва участников lst.append(k) lst_sort = sorted(lst, key=lambda x: x[1]) #Сортировка по кол-ву участников print (lst_sort) lst1 = lst_sort[-10:] #10 самых популярных print(lst1)
Ответы
Ответ 1
Отрывок из документации VK: Ограничения и рекомендации 3.1. Частотные ограничения К методам API ВКонтакте (за исключением методов из секций secure и ads) можно обращаться не чаще 3 раз в секунду. Если логика Вашего приложения подразумевает вызов нескольких методов подряд, имеет смысл обратить внимание на метод execute. Он позволяет совершить до 25 обращений к разным методам в рамках одного запроса.Ответ 2
С помощью execute можно реализовать вот так: import vk import math token ="" session = vk.Session(access_token=token) api = vk.API(session) group_id = "fineline_official" members = api.groups.getMembers(group_id=group_id, v="5.62") # сколько проходов потребуется, если брать из списка по 25 элементов # делим кол-во элемнтов на 25 и округляем в большую сторону num_of_pass = math.ceil(members["count"] / 25) groups_dict = dict() for npass in range(num_of_pass): pass_users = list() # забираем из списка 25 элементов for i in range(npass * 25, npass * 25 + 25): if i < members["count"]: pass_users.append(str(members["items"][i])) # код, который мы будем передавать code = """var u = [""" + ','.join(pass_users) + """]; var i = 0; var r = []; while(i < u.length) { r = r + API.groups.get({"user_id":u[i]}); i = i + 1; } return r;""" users_groups = api.execute(code = code); print(users_groups) for gid in users_groups: try: groups_dict[gid] += 1 except: groups_dict[gid] = 1
Комментариев нет:
Отправить комментарий