Python中缓慢的API请求循环

Python中缓慢的API请求循环,python,json,api,request,Python,Json,Api,Request,我试图从IEX的云服务器发出一些简单的API请求,以获取一些证券的收盘价。我成功地提取了数据,但这需要花费很长时间,而且数据量也不多。如果有人能帮助我重组代码,使其更快、更高效,那将是一个巨大的帮助。下面是我到目前为止所掌握的情况。。非常感谢各位 for i, row in Universe.iterrows(): try: request = urllib.request.urlopen('https://cloud.iexapis.com/stable/stock/'

我试图从IEX的云服务器发出一些简单的API请求,以获取一些证券的收盘价。我成功地提取了数据,但这需要花费很长时间,而且数据量也不多。如果有人能帮助我重组代码,使其更快、更高效,那将是一个巨大的帮助。下面是我到目前为止所掌握的情况。。非常感谢各位

for i, row in Universe.iterrows():
    try:
        request = urllib.request.urlopen('https://cloud.iexapis.com/stable/stock/'+Universe['ticker'][i]+'/chart/date/'+Px_1+'?chartByDay=true&token=TOKEN').read()
        data = json.loads(request)
        Universe['Px_1'][i] = data[0]['close']
    except:
        Universe['Px_1'][i] = np.nan

使用
requests
包创建一个可重用的持久连接,这将使每个请求更快:

import requests

session = requests.Session()

for i, row in Universe.iterrows():
    try:
        data = session.get(url).json()
        Universe['Px_1'][i] = data[0]['close']
    except:
        Universe['Px_1'][i] = np.nan
您还可以使用线程池并行运行请求:

from multiprocessing.dummy import Pool


def get_px1(ticker):
    url = 'https://cloud.iexapis.com/stable/stock/' + ticker + '/chart/date/' + Px_1 + '?chartByDay=true&token=TOKEN'
    try:
        data = session.get(url).json()
        return data[0]['close']
    except:
        return np.nan


Universe['Px_1'] = Pool(20).map(get_px1, Universe.ticker)
但是会话是否可以跨线程使用还不完全清楚,您可能需要使用一些特殊的东西,或者返回到
请求。服务器可能对如此高的请求率不满意


另外,请注意除
之外的
,因为它可能会悄悄地吞下代码中的错误。

使用
请求
包创建可重用的持久连接,这将使每个请求更快:

import requests

session = requests.Session()

for i, row in Universe.iterrows():
    try:
        data = session.get(url).json()
        Universe['Px_1'][i] = data[0]['close']
    except:
        Universe['Px_1'][i] = np.nan
您还可以使用线程池并行运行请求:

from multiprocessing.dummy import Pool


def get_px1(ticker):
    url = 'https://cloud.iexapis.com/stable/stock/' + ticker + '/chart/date/' + Px_1 + '?chartByDay=true&token=TOKEN'
    try:
        data = session.get(url).json()
        return data[0]['close']
    except:
        return np.nan


Universe['Px_1'] = Pool(20).map(get_px1, Universe.ticker)
但是会话是否可以跨线程使用还不完全清楚,您可能需要使用一些特殊的东西,或者返回到
请求。服务器可能对如此高的请求率不满意


另外,请注意除
之外的
,因为它可能会悄悄地吞噬代码中的错误。

您确定重新构造代码会使其更快吗?您是否使用探查器确认瓶颈是您的代码,而不是您发送请求的服务器?我不确定什么是好的速度?我运行了一个测试,它在156毫秒时到达。这是一个ping。你确定重新构造代码会使它更快吗?您是否使用探查器确认瓶颈是您的代码,而不是您发送请求的服务器?我不确定什么是好的速度?我做了一个测试,结果是156毫秒。这是一个ping。谢谢!这稍微加快了速度,但令人惊讶的是,这至少需要一分钟的时间来满足600个请求。你会建议把它从循环中移除吗?没错!非常感谢@Alex Hall!!非常感谢。这稍微加快了速度,但令人惊讶的是,这至少需要一分钟的时间来满足600个请求。你会建议把它从循环中移除吗?没错!非常感谢@Alex Hall!!