我想知道是否有办法做得更好?我想找到的每个对象转换成字符串,因为我觉得它与发现整个列表,然后在列表中转化每个项目:在re.findall上运行()
aList = regexObj.findall(s.text) if regexObj.findall(s.text) else None
self._menuUrls = map(lambda x: str('https://....' + x + '?otherparams=...'), aList)
是否有预先制作方法,我可以用它来做到这一点在一次通过或将这需要我创建一个单独的方法/ lambda?我能如何更有效地处理这个问题?
编辑:我做了一个包含500k可匹配实例的文件的几个方法的自己的研究,发现re.findall()的列表理解比使用re.finditer()在列表理解中快40-50%当你搜索一个项目的时候。
menuUrls = []
start = time.time()
regex = re.compile("javascript:iframeLink\('([^']+)'\);")
#My Original Solution = 0.78200006485
menuUrls = map(lambda x: str('http://...' + x + '?param=...'), regex.findall(str(lines)))
#My Revised Solution = 0.619000196457
menuUrls = [ str('http://...' + x + '?param=...') for x in regex.findall(str(lines)) ]
#Friend's Proposal = 0.802000045776
for m in regex.finditer(str(lines)):
menuUrls.append(str('http://...' + m.group(1) + '?param=...'))
#Stack Proposal = 0.912000179291
menuUrls = [ str('http://...' + x.group(0) + '?param=...') for x in regex.finditer(str(lines)) ]
set(menuUrls)
print time.time() - start
嗯,首先,'ALIST = regexObj.findall(s.text)if regexObj.findall(s.text)else None'非常低效,因为你调用了'regexObj.findall(s.text)'两次... –