优化API调用中的try-except

问题描述

我有2个从API调用返回相同结果的函数。 Function1比Function 2慢1.5倍,我不知道为什么吗?我也想优化最好的一个

功能1:

def get_pmid(df):
    pmid = []
    for doi in tqdm(df['DOI'].values):
        try:
            if convert.doi2pmid(doi) not in ['AMBIGUOUS','NOT_FOUND;INVALID_JOURNAL']:
                pmid.append(convert.doi2pmid(doi))
            else:
                pmid.append(None)
        except:
            pmid.append(None)
        time.sleep(uniform(0.6,1.2))
    return pmid

功能2:

def get_pmid_2(df):
    pmid = []
    for doi in tqdm(df['DOI']):
        try:
            pmid.append(convert.doi2pmid(doi))
        except:
            pmid.append(None)   
        time.sleep(uniform(0.6,1.2))
    for x,y in enumerate(pmid):
        if y in ['AMBIGUOUS','NOT_FOUND;INVALID_JOURNAL']:
            pmid[x] = None
    return pmid

解决方法

为什么第一个功能慢然后第二个慢?

  • 您调用convert.doi2pmid两次,而不是每次迭代一次。
  • 使用except而不指定您期望的异常是一种不好的做法。 (不影响性能)

如何优化此功能?

第二种算法具有线性时间复杂度,因此已经被很好地划分了。

,

大概convert.doi2pmid(doi)是一个相对昂贵的电话。您的第一个示例在结果不是两个排除的结果之一时会对其进行两次计算。对其进行一次计算,进行存储,然后测试和(如果适用)append存储的值。海象运算符:=的一个不错的用例:

def get_pmid(df):
    pmid = []
    for doi in tqdm(df['DOI'].values):
        try:
            # Cache result in p as well as testing membership
            if (p := convert.doi2pmid(doi)) not in ('AMBIGUOUS','NOT_FOUND;INVALID_JOURNAL'):
                pmid.append(p)  # append cached result
            else:
                pmid.append(None)
        except Exception:  # Please don't use bare except blocks; ideally,you'd target even more finely
            pmid.append(None)
        time.sleep(uniform(0.6,1.2))
    return pmid