首页 > 解决方案 > 我的小型 python 应用程序运行有点慢。可能的瓶颈?

问题描述

抱歉,伙计们提出了这个非常新奇的问题。

我刚刚使用 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()

标签: pythonbeautifulsoupstockpysimplegui

解决方案


原因可能是因为它正在等待所有输入而变慢。添加按钮并通过submit按下它来检索数据并返回到事件循环。 github 演示程序这里有很多例子供大家参考。

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()

推荐阅读