python-3.x - 我应该在生成器和函数之间使用什么来返回在 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])
从性能和效率的角度来看,哪个更好?
解决方案
首先我强烈建议你写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 核心开发人员)解释何时不使用生成器的答案。
结论:在您的情况下,使用生成器更有效,使用迭代器更快。
推荐阅读
- android - Android Exoplayer 播放 UDP 流无音频
- c++ - 投影矩阵导致剪辑截止问题
- javascript - 如何使用谷歌脚本向 Trello 上的自定义字段添加值?
- javascript - 如何让 mock-fs 正确地模拟文件系统
- hangfire - 使用 HangFire 调用动作委托产生异常
- c - C程序读取文件读取额外的行
- c - 原始套接字和 NF_INET_POST_ROUTING
- java - Reactor:如何将实体通量转换为 DTO 对象通量
- javascript - Javascript switch 语句计算被另一个函数调用以显示结果计算
- python - 从 youtube-dl 下载时,Python PyQt5 进度条不更新