首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python列表-理解速度太慢

Python列表-理解速度太慢
EN

Stack Overflow用户
提问于 2018-06-10 00:21:30
回答 1查看 1.1K关注 0票数 3

我有231个pdf文件,想把它们中的每一个都转换成字符串格式。随后,我将这些字符串中的每一个都保存到一个txt文件中。

我能够为此创建一段代码(当我为较少数量的元素运行代码时,我检查了它是否正常工作),但是python甚至在10h之后也没有完成程序的执行!

我使用"for loop“尝试了相同的代码,但它也太慢了。你知道我怎么才能让这段代码更快吗?

下面是我的代码:

代码语言:javascript
复制
from pdfminer.pdfinterp import PDFResourceManager, 
PDFPageInterpreter#process_pdf
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams

from io import StringIO

def pdf_to_text(pdfname):

    # PDFMiner boilerplate
    rsrcmgr = PDFResourceManager()
    sio = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, sio, codec=codec, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)

    # Extract text
    fp = open(pdfname, 'rb')
    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
    fp.close()

    # Get text from StringIO
    text = sio.getvalue()

    # Cleanup
    device.close()
    sio.close()

    return text

lista2 = [pdf_to_text(k) for k in lista1]

其中lista1是我的231个pdf的列表

pdf文件是从这个website中提取出来的。我只选择了名称中包含单词"Livro“的文件。

EN

回答 1

Stack Overflow用户

发布于 2018-06-10 01:06:03

这是生成器最好的用例之一:节省内存。

通常,您需要做的就是迭代文件,一次转换一个文件,然后将输出流式传输到其他地方。举个例子:

代码语言:javascript
复制
for f in files:
   text = pdf_to_text(f)
   output.write(text)

--那么你不需要(或需要)一个列表理解,事实上你根本不需要创建一个列表。相反,可以考虑一次只迭代一个元素。或者创建一个生成器,如果这更有意义的话。

请记住,如果您仍有对内存的引用,垃圾收集器将无法释放内存。如果您创建了一个列表理解,那么其中的所有元素(以及这些元素引用的项)必须一次全部保存在内存中。通常,仅当您计划频繁访问元素或以非线性顺序访问元素时,才需要它。

你还应该考虑这样一种可能性,即使你可以处理大文件,如果我们谈论的是值得读/写的千兆字节,allocate/transform/deallocate可能仍然“太慢”。在这种情况下,最好的替代方案通常是考虑使用C扩展,它可以更好地控制内存的分配和使用。此外,pypy在绝大多数情况下都可以工作,而且通常比CPython快得多。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50776263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档