很抱歉这个新手问题。
我刚刚使用PySimpleGUI和BeautifulSoup创建了一个小程序,该程序可以从TMXMoney网站读取实时股票。我知道这很糟糕,但是我对Python还是很陌生(实际上这是我的第一个程序)。
很遗憾,我的程序运行缓慢。当我将CMD + Tab转到浏览器并返回我的应用程序时,这需要花费几秒钟的时间。
我知道我可能有一些代码在困扰整个程序,所以我想知道是否有人可以帮助我确定该瓶颈是什么?
这里是代码:
import PySimpleGUI as sg
import time
import bs4
import requests
def parsePrice(sym):
r = requests.get("https://web.tmxmoney.com/quote.php?qm_symbol=" + sym) #Canadian stocks source (TSX)
soup = bs4.BeautifulSoup(r.text,"html.parser")
try:
price = soup.find("div", {"class":"labs-symbol"}).find("span", {"class":"price"}).find("span").text
return price
except:
return "Cannot find"
sg.theme('DarkBrown1')
layout = [[sg.Input(key="i1",font=('Helvetica', 20),size = (10,0)), sg.Text("0.00",size=(6,0), font=('Helvetica', 20), key="o1")],
[sg.Input(key="i2",font=('Helvetica', 20),size = (10,0)), sg.Text("0.00",size=(6,0),font=('Helvetica', 20), key="o2")],
[sg.Input(key="i3",font=('Helvetica', 20),size = (10,0)), sg.Text("0.00",size=(6,0),font=('Helvetica', 20), key="o3")],
[sg.Input(key="i4",font=('Helvetica', 20),size = (10,0)), sg.Text("0.00",size=(6,0),font=('Helvetica', 20), key="o4")],
[sg.Input(key="i5",font=('Helvetica', 20),size = (10,0)), sg.Text("0.00",size=(6,0),font=('Helvetica', 20), key="o5")],
[sg.Input(key="i6",font=('Helvetica', 20),size = (10,0)), sg.Text("0.00",size=(6,0),font=('Helvetica', 20), key="o6")]]
window = sg.Window("TSX Stocks", layout)
while True: # Event Loop
event, values = window.read(timeout=2000)
if event in (None, 'Quit'): # if user closed the window using X or clicked Quit button
break
if values['i1'] is not "":
window['o1'].update(parsePrice(values['i1']))
if values['i2'] is not "":
window['o2'].update(parsePrice(values['i2']))
if values['i3'] is not "":
window['o3'].update(parsePrice(values['i3']))
if values['i4'] is not "":
window['o4'].update(parsePrice(values['i4']))
if values['i5'] is not "":
window['o5'].update(parsePrice(values['i5']))
if values['i6'] is not "":
window['o6'].update(parsePrice(values['i6']))
time.sleep(1)
window.close()
原因可能是它正在等待所有输入,因此它正在减慢速度。添加submit
按钮,并通过按下按钮检索数据并返回到事件循环。github demo program这里有很多示例供您参考。
import PySimpleGUI as sg
import time
import bs4
import requests
def parsePrice(sym):
r = requests.get("https://web.tmxmoney.com/quote.php?qm_symbol=" + sym) #Canadian stocks source (TSX)
soup = bs4.BeautifulSoup(r.text,"html.parser")
try:
price = soup.find("div", {"class":"labs-symbol"}).find("span", {"class":"price"}).find("span").text
return price
except:
return "Cannot find"
sg.theme('DarkBrown1')
layout = [[sg.Input(key="i1",font=('Helvetica', 20),size = (10,0)), sg.Submit(key='-sym1-'), sg.Text("0.00",size=(6,0), font=('Helvetica', 20), key="o1")],
[sg.Input(key="i2",font=('Helvetica', 20),size = (10,0)), sg.Submit(key='-sym2-'), sg.Text("0.00",size=(6,0),font=('Helvetica', 20), key="o2")],
[sg.Input(key="i3",font=('Helvetica', 20),size = (10,0)), sg.Submit(key='-sym3-'), sg.Text("0.00",size=(6,0),font=('Helvetica', 20), key="o3")],
[sg.Input(key="i4",font=('Helvetica', 20),size = (10,0)), sg.Submit(key='-sym4-'), sg.Text("0.00",size=(6,0),font=('Helvetica', 20), key="o4")],
[sg.Input(key="i5",font=('Helvetica', 20),size = (10,0)), sg.Submit(key='-sym5-'), sg.Text("0.00",size=(6,0),font=('Helvetica', 20), key="o5")],
[sg.Input(key="i6",font=('Helvetica', 20),size = (10,0)), sg.Submit(key='-sym6-'), sg.Text("0.00",size=(6,0),font=('Helvetica', 20), key="o6")],
[sg.Quit()]]
window = sg.Window("TSX Stocks", layout)
while True: # Event Loop
event, values = window.read()
print(event, values)
if event in (None, 'Quit'): # if user closed the window using X or clicked Quit button
break
if event == '-sym1-':
symbol = values['i1']
price = parsePrice(symbol)
window['o1'].update(price)
if event == '-sym2-':
symbol = values['i2']
price = parsePrice(symbol)
window['o2'].update(price)
if event == '-sym3-':
symbol = values['i3']
price = parsePrice(symbol)
window['o3'].update(price)
if event == '-sym4-':
symbol = values['i4']
price = parsePrice(symbol)
window['o4'].update(price)
if event == '-sym5-':
symbol = values['i5']
price = parsePrice(symbol)
window['o5'].update(price)
if event == '-sym6-':
symbol = values['i6']
price = parsePrice(symbol)
window['o6'].update(price)
# time.sleep(1)
window.close()