【发布时间】:2014-11-26 22:54:13
【问题描述】:
所以我有大约 400 个文件,大小从 10kb 到 56mb,文件类型为 .txt/.doc(x)/.pdf/.xml,我必须全部阅读。我读入的文件基本上是:
#for txt files
with open("TXT\\" + path, 'r') as content_file:
content = content_file.read().split(' ')
#for doc files using pydoc
contents = '\n'.join([para.text for para in doc.paragraphs]).encode("ascii","ignore").decode("utf-8").split(' ')
#for pdf files using pypdf2
for i in range(0, pdf.getNumPages()):
content += pdf.getPage(i).extractText() + "\n"
content = " ".join(content.replace(u"\xa0", " ").strip().split())
contents = content.encode("ascii","ignore").decode("utf-8").split(' ')
#for xml files using lxml
tree = etree.parse(path)
contents = etree.tostring(tree, encoding='utf8', method='text')
contents = contents.decode("utf-8").split(' ')
但我注意到,即使读取 30 个每个大小低于 50kb 的文本文件并对其进行操作也需要 41 秒。但是如果我读取一个 56mb 的文本文件需要 9 秒。所以我猜是文件 I/O 让我慢了下来,而不是我的程序。
关于如何加快这个过程的任何想法?也许将每种文件类型分解为 4 个不同的线程?但是你会怎么做呢,因为他们共享同一个列表,当他们完成后,这个列表将被写入一个文件。
【问题讨论】:
-
如果你的工作代码表现不佳,你真的应该尝试使用分析器来确定代码慢的地方,而不是猜测。
-
您有喜欢使用的分析器吗?或者除了从程序开始到各处都坚持打印时间之外,我该怎么做?
-
即使没有分析器,您也可以非常快速地验证 I/O 操作是否正确:只需测试
read文件需要多长时间而不做任何事情,与多长时间它需要做你的处理。如果大致相同,那么您是对的,这绝对是 I/O 时间。如果它快很多……好吧,它可能仍然是 I/O 时间(例如,您正在使用的模块可能会进行很多低效的查找或小读取),但它可能不是,所以你需要配置文件。
标签: python performance io