Что я должен использовать между генератором и функцией с возвратом для анализа резюме в python, где мне нужно обрабатывать много резюме одновременно? - PullRequest
0 голосов
/ 25 апреля 2018

Мне просто нужно быть уверенным в производительности, так как в настоящее время я работаю с функциями с возвратами и , для отображения всего результата требуется слишком много времени . Следующий подход используя 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])

что будет лучше с точки зрения производительности и эффективности?

1 Ответ

0 голосов
/ 25 апреля 2018

Перво-наперво, я настоятельно рекомендую написать Clean Code, то есть, когда вы пишете Python не пишите C#/Java (a.k.a 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-файлах, и итератор был быстрее на пару секунд ( обычно это имеет место в отношении скорости ). генератор для эффективности, посмотрите на этот ответ Рэймонда Хеттингера (разработчика ядра Python), объясняющий, когда не , чтобы использовать генераторы.

Для заключения: в вашем случае эффективнее использовать генератор и быстрее с итератором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...