在API调用中优化tryexcept

2024-05-16 22:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个函数,它们从API调用返回相同的结果。函数1比函数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

Tags: 函数innoneconvertdfforgetdef
2条回答

大概convert.doi2pmid(doi)是一个相对昂贵的电话。当结果不是两个排除的结果之一时,您的第一个示例将计算它两次。计算它一次,存储它,然后测试(如果合适的话)append存储的值。walrus操作符的一个不错的用例,:=

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

为什么第一个函数比第二个慢?

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

如何优化此功能?

第二种算法具有线性时间复杂度,因此它已经设计得很好

相关问题 更多 >