Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Ускорить код ищущий 10 самых популярных групп среди подписчиков заданной группы ВКонтакте

#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

Комментариев нет:

Отправить комментарий