python - Python列表理解太慢了
问题描述
我有 231 个 pdf 文件,并且想将它们中的每一个都转换为字符串格式。随后,我会将这些字符串中的每一个保存到一个 txt 文件中。
我能够为此创建一个代码(我检查了它在我为较少数量的元素运行代码时是否有效),但即使在 10 小时后 python 也没有完成执行程序!
我使用“for循环”尝试了相同的代码,但它也太慢了。知道如何使这段代码更快吗?
这是我的代码:
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 文件是从这个网站中提取的。我只选择了名称中带有“Livro”一词的文件。
解决方案
这是生成器的重要用例之一:节省内存。
通常,您需要做的就是遍历文件,一次转换一个文件并将输出流式传输到其他地方。比如说:
for f in files:
text = pdf_to_text(f)
output.write(text)
-- 那么你不想要(或不需要)一个列表理解,事实上你根本不需要创建一个列表。相反,考虑一次只迭代一个元素。或者创建一个生成器,如果这更有意义的话。
请记住,如果您仍然有对它的引用,垃圾收集器将无法释放内存。如果您创建一个列表推导式,那么其中的所有元素(以及这些元素引用的项目)必须一次全部保存在内存中。通常,只有在您计划频繁访问元素或以非线性顺序访问元素时才需要它。
您还应该考虑处理大文件的可能性,即使您可以这样做allocate
//如果我们谈论的是值得读transform
/deallocate
写的许多 GB 数据,可能仍然“太慢”。在这种情况下,最好的选择通常是考虑使用 C 扩展,它可以更好地控制内存的分配和使用方式。此外,pypy
在绝大多数情况下都有效,并且通常比 CPython 快得多。
推荐阅读
- cron - 每次运行时创建文件的 Cron 作业
- html - 是否可以自定义文本框的形状?
- json - 使用 Pyspark 将包含在单个文件中的 JSON 对象合并到一个 JSON 文件中
- python-3.x - Python 3.6:NameError:名称“A”未定义
- c - 从C中的字符串中删除出现的数组
- aws-kms - 微软的 KMS 在功能上是否与亚马逊的 KMS 相同?
- mysql - MySQL - 多行触发器
- pycharm - 使用 attrs 对子类进行 Pycharm 类型提示
- python - QTableView中的单选行激活列编辑
- reactjs - 基于 JSON 文件加载图片 react