问题描述
我有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