2017-06-19 42 views
1

我目前正在運行一個Python腳本來通過Sonkick API收集音樂會數據。雖然腳本正在運行,但一段時間後,速度變得非常緩慢。我正在尋找解決此問題的最有效方法。API Python腳本在一段時間後變慢,如何讓代碼更快?

下面你可以找到我的腳本:

import urllib2 
import requests 
import json 

from tinydb import TinyDB, Query 
db = TinyDB('concerts_songkick.json') 

#retrieve concert data for every artist in artistid.txt 
def load_events(): 
     MIN_DATE = "2015-05-26" 
     MAX_DATE = "2017-04-25" 
     API_KEY= "##############" 
     with open('artistid.txt', 'r') as f: 
      for a in f: 
       artist = a.strip() 
       print(artist) 
       url_base = 'http://api.songkick.com/api/3.0/artists/{}/gigography.json?apikey={}&min_date={}&max_date={}' 
       url = url_base.format(artist, API_KEY, MIN_DATE, MAX_DATE) 
       try: 
        r = requests.get(url) 
        resp = r.json() 
        if(resp['resultsPage']['totalEntries']): 
        results = resp['resultsPage']['results']['event'] 
        for x in results: 
         print(x) 
         db.insert(x) 
       except: 
        print('cannot fetch url',url); 

load_events() 
db.close() 
print ("End of script")  
+0

是否有可能api根據請求的數量限制您的請求?無論如何,你可以使用進程池來並行化你的代碼。 – suvy

+0

不要使用'string.format'來構建URL,至少在事先沒有正確的URL轉義值的情況下。 'MIN_DATE','MAX_DATE'和'API_KEY'可能適合使用未轉義,但'藝術家'絕對需要轉義。 – Tomalak

+0

聽起來像API節制你,我沒有看到任何理由爲什麼執行會減慢。您總是可以嘗試打印請求獲取每個頁面所用的時間,並查看時間增加? – Baldrickk

回答

0

檢查腳本的CPU使用率和內存消耗:

watch -n 0.5 ps -ur 

檢查到底是哪部分代碼被堵塞的內存。使用Python Memory Profiler

... 
from memory_profiler import profile 
@profile 
def load_events() 
    ... 

,並記錄內存消耗隨着時間的命令:

python your_script.py > memory_profile_logging.log 

這應該給你你需要優化什麼心中有數。

0

由於您正在執行io綁定操作,請嘗試使用grequests並異步從API獲取數據。