首页 > 解决方案 > 我应该在生成器和函数之间使用什么来返回在 python 中进行简历解析,我需要一次处理大量简历?

问题描述

我只需要确定性能,因为目前我正在使用带返回的函数, 并且显示整个结果需要花费太多时间。以下是使用yeild的方法

dirpath="E:\\Python_Resumes\\"

 def getResumeList(dirpath):
   resumes=[]
   files = os.listdir(dirpath)
   for file in files:
     if file.endswith(".pdf"):
         yield file

fileObject=getResumeList(dirpath)

def convertToRawText(fileObject):
 rawText=""
 resumeContent={}
 for file in fileObject:
    fContent=open(dirpath+file,'rb')
    rsrcmgr = PDFResourceManager()
    sio = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, sio, codec=codec, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.get_pages(fContent):
         interpreter.process_page(page)
         rawText = sio.getvalue()
         yield rawText


result=convertToRawText(fileObject)

for r in result:
   print(r)
   print("\n")

以下是使用 return 的方法

def getResumeList(dirpath): 
 resumes=[]
 files = os.listdir(dirpath)# Get all the files in that directory
 for file in files:
    if file.endswith(".pdf"):
     resumes.append(file)
 return resumes

listOfFiles=getResumeList(dirpath)

def convertToRawText(files):
  rawText=""
  resumeContent={}
  for file in files:
    fContent=open(dirpath+file,'rb')
    rsrcmgr = PDFResourceManager()
    sio = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, sio, codec=codec, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.get_pages(fContent):
         interpreter.process_page(page)
         rawText = sio.getvalue()
    resumeContent[file]=rawText
return resumeContent

bulkResumesText={}
bulkResumesText = convertToRawText(list(listOfFiles))

for b in bulkResumeText:
 print(bulkResumeText[b])

从性能和效率的角度来看,哪个更好?

标签: python-3.xperformancetext-parsing

解决方案


首先我强烈建议你写Clean Code,这意味着当你写的Python时候不要写C#/Java(又名PEP8

另一个问题是:尝试成为pythonic有时它甚至使您的代码更快),例如,而不是您getResumeList()在生成器示例中,尝试generator expression

def get_resume_list(dir_path):
    files = os.listdir(dir_path)
    return (f for f in files if f.endswith(".pdf"))

或列表理解,在第二个示例中:

def get_resume_list(dir_path):
    files = os.listdir(dir_path)
    return [f for f in files if f.endswith(".pdf")]

当您打开文件时,请尝试使用with,因为人们往往会忘记关闭文件。

关于效率,很明显,生成器就是为此而创建的。使用生成器,您可以在准备好后立即查看每个结果,而无需等待整个代码完成处理。

关于性能,我不知道您要解析多少个 pdf 文件,但我对 1056 个 pdf 文件进行了一些测试,并且迭代器快了几秒钟通常是速度测量的情况)。生成器是为了提高效率,请查看Raymond Hettinger(Python 核心开发人员)解释何时使用生成器的答案。

结论:在您的情况下,使用生成器更有效,使用迭代器更快。


推荐阅读