объекты потоков и urlrequests


Приведенный ниже код дает хорошее представление о моих навыках программирования. Я уже около 6 месяцев. Меня интересуют способы, чтобы сделать следующую программу быстрее. В настоящее время я имею urlrequests резьбой для извлечения информации для 500 акций, но это все еще слишком медленно (около 30 секунд). То, что Python методы я могу использовать, чтобы сделать эту программу более эффективной?

Спасибо!

from urllib.request import urlopen
from csv import reader
from threading import Thread


class StockQuote():
    """gets stock data from Yahoo Finance"""

    def __init__(self, quote):
        self.quote = quote

    def lastPrice(self):
        url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=l1'.format(ticker=self.quote)
        return bytes.decode((urlopen(url).read().strip()))

    def volume(self):
        url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=v0'.format(ticker=self.quote)
        return bytes.decode((urlopen(url).read().strip()))

    def yearrange(self):
        url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=w0'.format(ticker=self.quote)
        return bytes.decode((urlopen(url).read().strip()))

    def PEratio(self):
        url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=r0'.format(ticker=self.quote)
        return bytes.decode((urlopen(url).read().strip()))

    def bookValue(self):
        url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=b4'.format(ticker=self.quote)
        return bytes.decode((urlopen(url).read().strip()))

    def EBITDA(self):
        url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=j4'.format(ticker=self.quote)
        return bytes.decode((urlopen(url).read().strip()))

    def PEGRatio(self):
        url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=r5'.format(ticker=self.quote)
        return bytes.decode((urlopen(url).read().strip()))

    def ticker(self):
        url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=s0'.format(ticker=self.quote)
        return bytes.decode((urlopen(url).read().strip()))


class StockData(Thread):


    def __init__(self, stk, fileobj):
        Thread.__init__(self)
        self.stk = stk
        self.fileobj = fileobj

    def run(self):
        try:
            stkObj = StockQuote(self.stk)
            stkdata= {}
            stkdata['Ticker'] = stkObj.ticker()
            stkdata['Price'] = stkObj.lastPrice()
            stkdata['PE Ratio'] = stkObj.PEratio()
            stkdata['Volume'] = stkObj.volume()
            stkdata['Year Range'] = stkObj.yearrange()
            stkdata['Book Value per Share'] = stkObj.bookValue()
            stkdata['EBITDA'] = stkObj.EBITDA()
            stkdata['PEG Ratio'] = stkObj.PEGRatio()
        except Exception:
            pass
        self.fileobj.write(str(stkdata))

def openSP500file():
    SP500 = reader(open(r'C:\Users\test\Desktop\SP500.csv', 'r'), delimiter=',')
    printlist = open(r'C:\Users\test\Desktop\SP500prices.txt', 'w')
    for x in SP500:
        indStk = x[0]
        t1 = StockData(indStk, printlist)
        t1.start()


def main():
    openSP500file()


if __name__ == '__main__':
    main()


Комментарии
1 ответ

Трудно сделать программу быстрее, потому что время в основном расходуется на Ио и соединений url. Это поможет для проверки изменений, если вы могли бы предоставить в CSV-файлы.

С другой стороны, кодекс может быть значительно упрощена. Следующий код не тестировался (не в CSV-файлы), но дает представление:

from urllib.request import urlopen
from csv import reader
from threading import Thread

class StockQuote():
"""gets stock data from Yahoo Finance"""

names = dict(lastPrice='l1', volume='v0', yearrange='w0', PEratio='r0',
bookValue='b4', EBITDA='j4', PEGRatio='r5', ticker='s0')

def __init__(self, quote):
self.quote = quote
self.url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f={par}'

def __getattr__(self, name):
url = self.url.format(ticker=self.quote, par=StockQuote.names[name])
return bytes.decode((urlopen(url).read().strip()))

class StockData(Thread):

def __init__(self, stk, fileobj):
Thread.__init__(self)
self.stk = stk
self.fileobj = fileobj

def run(self):
stkdata = {}
stkObj = StockQuote(self.stk)
for prprty in StockQuote.names:
try:
func = getattr(stkObj, prprty)
stkdata[prprty] = func()
except Exception:
pass

self.fileobj.write(str(stkdata))

def openSP500file():
SP500 = reader(open(r'C:\Users\test\Desktop\SP500.csv', 'r'), delimiter=',')
printlist = open(r'C:\Users\test\Desktop\SP500prices.txt', 'w')
for x in SP500:
indStk = x[0]
t1 = StockData(indStk, printlist)
t1.start()

def main():
openSP500file()

if __name__ == '__main__':
main()

1
ответ дан 19 декабря 2011 в 01:12 Источник Поделиться