Python Rest API调用速度

时间:2016-05-22 10:30:45

标签: python performance api rest http

我目前正在开发一个项目,要求我在线从REST API中提取数据,然后将其转储到本地数据库中进行进一步处理。

API连接到在线发票平台,我有点担心脚本的速度。

目前我的脚本会打开一个连接,建立一个发票列表。对于每个发票,脚本然后打开该特定发票行的连接,该连接将被转储到另一个列表中。

我目前正在阅读一个包含9张发票和共15张发票的帐户。这需要我花费7.4秒来检索。

任何人都可以帮我处理我的代码吗?也许我可以加快一点。

# -*- coding: utf-8 -*-
import requests
from datetime import datetime
token = "b877aff346ec0c7d238c21a6c33929c84b13a110"

def request(accessToken, url):
    link = 'https://api.billysbilling.com/v2/' +str(url)
    headers=  {'X-Access-Token': accessToken}
    data = requests.get(link, headers=headers).json()
    return data

def invoiceLines(token):
    inv = request(accessToken = token, url = "invoices")["invoices"]
    idList = []
    invoiceLinesList = []
    lines = []
    for r in inv:
        if not r["id"] in idList:
            idList.append(r["id"])
            invoiceLinesList.append(request(accessToken = token,
                                    url = str("invoiceLines?invoiceId=") +
                                          str(r["id"]))["invoiceLines"])
    for invoice in invoiceLinesList:
        for line in invoice:
            lines.append(line)
    return [inv, lines]

start = datetime.now()
data = invoiceLines(token)
print "Time spent - " + str(datetime.now()-start)
print "Invoices - " + str(len(data[0]))
print "Invoice lines - " +str(len(data[1]))

由于 亨利克

1 个答案:

答案 0 :(得分:1)

使用请求session,它会自动为多个请求重复使用一个连接。例如:

class BillingAPI(object):

    def __init__(self, token, root_url='https://api.billysbilling.com/v2/'):
        self._session = requests.Session()
        self._session.headers['X-Access-Token'] = token
        self.root_url = root_url

    def get(self, url_part):
        url = self.root_url + str(url_part)
        return self._session.get(url).json()


def invoiceLines(token):
    api = BillingAPI(token)
    inv = api.get('invoices')['invoices']
    # ...

您还可以尝试并行请求不同发票的发票行。 requests-futures扩展名可以提供帮助。但请注意以免服务器过载。

除此之外,您可能会受到您正在使用的API的服务器性能的限制。

考虑是否可以采用一般优化,例如缓存。 CacheControl库为请求提供了一个简单的HTTP缓存,但此API不太可能支持HTTP缓存,因此您需要自己推送。