如何在不丢失结果的情况下优化 python 代码?
How do I optimize python code without losing results?
我当时正在开发一个电报机器人,当我终于完成所有工作时,我发现它非常慢。
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 是我从 google 搜索中抓取的网址数量,较少的网址我抓取的次数较少。
我无法减少 url 的数量,所以也许可以优化另一部分代码以减少时间?
有很多问题,但我猜测 s()
的主要减速是由于不必要地重复调用 pyscp.wikidot.Wiki('scpfoundation.net')
。此 Web 请求针对 searchlines
中的每个匹配项执行一次,然后再执行 5 次。我假设这是每次检索到的完全相同的数据。
在我看来,你最多只能在 s()
中执行一次,然后在你的 while
循环中使用保存的结果。
我当时正在开发一个电报机器人,当我终于完成所有工作时,我发现它非常慢。
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 是我从 google 搜索中抓取的网址数量,较少的网址我抓取的次数较少。
我无法减少 url 的数量,所以也许可以优化另一部分代码以减少时间?
有很多问题,但我猜测 s()
的主要减速是由于不必要地重复调用 pyscp.wikidot.Wiki('scpfoundation.net')
。此 Web 请求针对 searchlines
中的每个匹配项执行一次,然后再执行 5 次。我假设这是每次检索到的完全相同的数据。
在我看来,你最多只能在 s()
中执行一次,然后在你的 while
循环中使用保存的结果。