首页 > 解决方案 > 如何在不丢失结果的情况下优化 python 代码?

问题描述

我正在开发一个电报机器人,当我最终完成所有工作时,我发现它非常慢。

s()需要 5-7 秒才能获得结果并将其发送给用户,我尝试使用其他站点的方法对其进行优化,但没有奏效。

我该如何优化它?

import telebot
import pyscp
from googlesearch import search
scp = "scp-"
bot = telebot.TeleBot("NO")

def extract_arg(arg):
    return arg.split()[1:]

@bot.message_handler(commands=['o'])
def o(message):
   global status
   status = extract_arg(message.text)
   try:
    object = status[0]
   except Exception as e:
    object ="7777"
   l = scp + object
   url = "scpfoundation.net/" + l
   ru_wiki = pyscp.wikidot.Wiki('scpfoundation.net')
   p = ru_wiki(l)
   try:
    k = ('{}'.format(p.title))
    text = (f'<a href="{url}">{k}</a>')
   except Exception as e:
    text="Простите, этот номер не присвоен не одному из объектов"
   bot.send_message(message.chat.id, text,parse_mode='HTML')

def extract_argument(argument):
    return argument.split()[3:]

@bot.message_handler(commands=['s'])
def s(m):
    status1 = m.text
    status2 = status1.replace('/s', "")
    f = open("base.txt", "r")
    searchlines = [line.strip() for line in f.readlines() if line.strip()]
    f.close()
    out = []
    out1=[]
    try:
        for i, line in enumerate(searchlines):
                if status2.lower() in line.lower():
                            for l in searchlines[i : i + 1]:
                                    out.append(l.split(maxsplit=1)[0])
                                    out1.append(l.split(maxsplit=1)[1])
    except Exception as e:
        bot.send_message(m.chat.id, "Простите, не смог ничего найти.",parse_mode='HTML')
        pass
    finalout = list(set(out))
    number = len(finalout)
    g, nm, count, count1, gey =[], int("0"), int("0"), int("0"), []
    while (nm<number):
        url = 'http://scpfoundation.net/'
        try:
            ru_wiki = pyscp.wikidot.Wiki('scpfoundation.net')
            p = ru_wiki(finalout[count])
            k = ('{}'.format(p.title))
            gey.append(k)
            result = " ".join ([url, finalout[count]])
            g.append(f'<a href="{result}">{k}</a>')
        except Exception as e:
            pass
        count+=1
        count1+=1
        nm+=1
    numbeer=int('0')
    counter=int('0')
    ka = search(f'{status2} site:scpfoundation.net', num_results=4)
    while (numbeer<5):
        try:
            ru_wiki = pyscp.wikidot.Wiki('scpfoundation.net')
            p = ru_wiki(ka[counter])
            kj = ('{}'.format(p.title))
            if (kj not in gey and "forum" not in ka[counter] and "draft" not in ka[counter] and "fragment" not in ka[counter]):
                    result = ka[counter]
                    g.append(f'<a href="{result}">{kj}</a>')
        except Exception as e:
            pass
        numbeer+=1
        counter+=1
    story = '\n'.join(g)
    try:
        bot.send_message(m.chat.id, story,parse_mode='HTML')
    except Exception as e:
        bot.send_message(m.chat.id, "Простите, ничего не найдено.", parse_mode='HTML')

@bot.message_handler(commands=['help'])
def help(t):
    bot.send_message(t.chat.id, "/o — поиск по номеру; /s — поиск по названию; /help — это сообщение; /join — присоеденится к сообществу; /faq — ответы на частые вопросы",parse_mode='HTML')

@bot.message_handler(commands=['join'])
def join(j):
    joiner=(f'<a href="http://scpfoundation.net/system:join">Подай простую заявку!</a>')
    bot.send_message(j.chat.id, joiner,parse_mode='HTML')

@bot.message_handler(commands=['faq'])
def faq(f):
    faqer=(f'<a href="http://scpfoundation.net/faq">Читать тут.</a>')
    bot.send_message(f.chat.id, faqer,parse_mode='HTML')
bot.polling()

问题出在while (numbeer<5).

5 是我从谷歌搜索中获取的 url 数量,更少的 url 我获取的次数更少。

我不能减少 url 的数量,所以也许可以优化另一部分代码以减少时间?

标签: pythonpython-3.xoptimizationtelegram-bot

解决方案


有很多问题,但我猜测主要放缓s()是由于不必要地重复调用pyscp.wikidot.Wiki('scpfoundation.net'). 该网络请求在每场比赛中执行一次,searchlines然后再执行 5 次。我假设这是每次检索到的完全相同的数据。

在我看来,你应该最多只做一次,s()然后在你的while循环中使用保存的结果。


推荐阅读