2016-05-22 81 views
0

我目前正在研究一個項目,該項目需要我從REST API在線提取數據,並將其轉儲到本地數據庫中以供進一步處理。Python Rest API調用速度

該API連接到在線開票平臺,我有點關心腳本的速度。

目前我的腳本打開一個連接,建立一個發票清單。對於每張發票,腳本會爲特定發票行打開一個連接,並將其轉儲到另一個列表中。

我正在閱讀一個包含9張發票和共15個invoicelines的帳戶。這需要我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])) 

感謝 亨裏克

+0

數據從遠程服務器檢索需要多長時間?如果7秒總共需要6.8秒,那麼改進的選項就不多了。看看timeit http://dabeaz.blogspot.co.uk/2010/02/context-manager-for-timing-benchmarks.html –

回答

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緩存,因此您需要自行推出。

+0

非常好的解決方案Vasiliy,只是減少了三分之二的時間,我會研究請求 - 期貨延期。 –