2016-12-21 58 views
1

我有DF 1000行的样本第一次尝试,我从Excel,它看起来像,上面写着:大熊猫适用于螺纹

exFcode 
0 38907030 
1 47036870 
2 54060696 
3 38907039 
4 100811680 
(...) 

我需要分配的每个码数篇。为此,我连接到一个采用每个代码的API(此API仅允许每个请求一个代码)并在df的第二列中返回值。目前我这样做:

def getArticles(code): 
    r = requests.get(API_link % code).content 
    jsonized = json.loads(r.decode("utf-8")) 
    try: 
     num_articles = jsonized["TotalRecords"] 
    except: 
     return 'not found' 
    return num_articles 

df['articles'] = df["exFcode"].apply(lambda row: getArticles(row)) 

它做的工作,但它很慢,逐一执行每个操作。对于1000个码,大约需要10分钟。很多时候我必须处理50k以上的文件...

我在想如何更有效地做到这一点。我想我可以将df分成两部分,然后在单独的线程中执行每个部分。这是我第一次尝试将线程应用到我的程序中...所以我创建了两个附加函数wrapper和main。

def wrapper(df): 
    df['articles'] = df["exFcode"].apply(lambda row: getArticles(row)) 
    return df 

def main(df): 
    #separate df to two even halves 
    half = int(len(df)) 
    df1 = df.iloc[:half] 
    df2 = df.iloc[half:] 
    t1 = Thread(target=wrapper, args=(df1,)) 
    t2 = Thread(target=wrapper, args=(df2,)) 
    t1.start() 
    t2.start() 
    print('completed') 

然而,当我执行功能main(df)没有任何反应。我完全误解了线程的概念吗?任何其他想法如何使它更有效率?

回答

1

当线程开始时,您打印“完成”。但你错过了join部分等待他们完成。

t1.start() 
t2.start() 
print('threads started') 
t1.join() 
t2.join() 
print('really completed') 
+0

好点!谢谢。但是,我收到了一些与请求包相关的例外。这必须是API的限制,尽管... – pawelty