Задать вопрос
@NightNetwork

Как можно оптимизировать/ускорить мой код?

import vk_api
from vk_api.utils import get_random_id
import json
import re
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
vk_session = vk_api.VkApi(token='скрыл')
vk = vk_session.get_api()
longpoll = VkBotLongPoll(vk_session, "скрыл")
GROUP_IDS = list(range(3, 9))
ALLOWED_USER_IDS = []


idsss = {скрыл}
def kick_user(chat_id, user_id):
    if str(chat_id) in str(idsss):
        chat_name = idsss[f'{chat_id}']
    else:
        chat_name = "Неизвестная беседа."
    try:
        vk_session.method('messages.removeChatUser', {'chat_id': chat_id, 'user_id': user_id})
        send_message(2, f"ЛОГ » Пользователь с ID {user_id} успешно кикнут из беседы {chat_name}")
    except vk_api.exceptions.ApiError as error_msg:
        pass

def get_user_id_from_link(link, patern):
    match = re.search(rf'(?<={patern})\d+', link)
    if match:
        user_id = match.group(0)
        return user_id
    return None
def get_user_id_from_link2(link, patern):
    match = re.search(fr'{patern}(\w+)', link)
    if match:
        user_ids = match.group(1)
        return user_ids
    else:
        return None

def send_message(chat_id, message):
    vk_session.method('messages.send', {'chat_id': chat_id, 'message': message, 'random_id': 0})

def get_user_id(user_arg):
    prefixes = ["vk.com/id", "https://vk.com/id", "http://vk.com/id"]
    for prefix in prefixes:
        if user_arg.startswith(prefix):
            return get_user_id_from_link(user_arg, prefix)
    if user_arg.startswith('https://vk.com/') or user_arg.startswith('http://vk.com/') or user_arg.startswith('vk.com/'):
        prefix2, user_ids = get_prefix_and_user_ids(user_arg)
        if user_ids:
            user_ids2 = vk_session.method('utils.resolveScreenName', {'screen_name': user_ids})
            try:
                return user_ids2['object_id']
            except Exception:
                return None
    else:
        return user_arg
    return None

def get_prefix_and_user_ids(user_arg):
    prefixes = ['https://vk.com/', 'http://vk.com/', 'vk.com/']
    for prefix in prefixes:
        if user_arg.startswith(prefix):
            return prefix, get_user_id_from_link2(user_arg, prefix)
    return None, None

def process_command(event):
    if event.obj.peer_id != event.obj.from_id:
        return
    else:
        if event.obj.text.startswith('/help'):
            if event.obj.from_id not in ALLOWED_USER_IDS:
                send_message(2, f"ЛОГ » Пользователь с ID: {event.obj.from_id} попытался использовать /help.")
                return
            else:
                vk_session.method('messages.send', {'peer_id': event.obj.from_id, 'message': "скрыл ", 'random_id': 0})
        elif event.obj.text.startswith('/kick'):
            if event.obj.from_id not in ALLOWED_USER_IDS:
                send_message(2, f"ЛОГ » Пользователь с ID: {event.obj.from_id} попытался использовать /kick.")
                return
            else:
                args = event.obj.text.split()
                user_args = args[1:]
                for user_arg in user_args:
                    user_id = get_user_id(user_arg)
                    send_message(2, f"ЛОГ » Занимаюсь киком сотрудника с ID {user_id}")
                    for chat_id in GROUP_IDS:
                         kick_user(chat_id, user_id)
          
                if user_id == None:
                    vk_session.method('messages.send', {'peer_id': event.obj.from_id, 'message': "ЛОГ » Ошибка в получении айди.", 'random_id': 0})
                else:
                    vk_session.method('messages.send', {'peer_id': event.obj.from_id, 'message': "ЛОГ » Выполнено. Отчет в беседе", 'random_id': 0})

for event in longpoll.listen():
    if event.type == VkBotEventType.MESSAGE_NEW and event.obj.text:
        process_command(event)


У меня есть вот такой код. Программирование занимаюсь довольно мало, говнокода многовато. Сам кик происходит ОЧЕНЬ долго, особенно если аргументов штук 20. Пробовал asyncio и многопоточность, но кик так и оставался очень медленным. Больше всего интересуют советы/решения на счет ускорения кода, но и может идеи как можно сделать код более красивым.
  • Вопрос задан
  • 148 просмотров
Подписаться 2 Простой 7 комментариев
Решения вопроса 1
@LuchnikKek
Python Backend developer
Думаю, узким местом служит синхронность самого VK API.
Для ускорения я бы взял готовую асинхронную обёртку и пробовал переписать на неё.
Глянь здесь. У некоторых даже тутор для новичков прямо в github лежит.
По "красоте" кода:
- Лично мне глаза режет лесенка из if-ов. Тут наглядно об этом. Если ещё короче - замени их обратными условиями и вложенность исчезнет.
- Во многих местах в конце функции return None излишний. Если функция ничего не вернула, ты и так получишь None.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
Так а в чем проблема дебаг накатить и посмотреть кто ест время
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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