我正在编写一个程序来帮助我解析一个很长的日志。我们正在谈论成千上万的线路。当然,目标是快速获取摘要数据,这意味着对内存问题应保持认真。
日志中包含多个部分/步骤。现在,将日志读取为字符串,然后仔细检查并列出测试的开始索引和结束索引。
我的目标是快速找出以下几点
我目前正在这样做
numLines = logFileString[rec["startMarker"]:rec["endMarker"]].count("\n")
foundAssert = "Assert.java" in logFileString[rec["startMarker"]:rec["endMarker"]]
foundFailure = "[SEVERE ]" in logFileString[rec["startMarker"]:rec["endMarker"]]
我的想法是,如果我将logFileString[rec["startMarker"]:rec["endMarker"]]
一个变量重新使用,那肯定会迫使Python将字符串的那一部分(可能是数千行)复制到一个变量中。也许不这样做意味着python可以通过仅流传输文件或其他东西来进行优化。
我不想使代码复杂得多,但我也想减少该代码运行所需的延迟。我知道我可以测量确定更快速度的时间,但是我想更多地了解python3在这些操作过程中如何处理字符串数据,我不知道从哪里开始。
我的问题本质上是:我现在正在执行什么操作,迫使python复制大部分字符串吗?有没有一种更有效的方式来获取这三个指标?
我不知道Python在这里可以采用什么优化。
跟进我的评论。
我首先要运行一个程序,然后再担心速度和效率。
Python将每秒从一个文本文件读取数百万行。您的文件读取速度应该不是问题。磁带已经退役了!
您还将描述面向行的过程。即,您不需要将整个文件读入内存。
如果是这样,请尝试以下方法:
found=[]
with open(ur_file) as f:
for i,line in enumerate(f):
if any(test in line for test in ("Assert.java", "[SEVERE ]")):
found.append((i, line.rstrip()))
print(f'Total Lines: {i:,}')
print('lines with tests found: {}'.format('\n'.join(map(str, found))))
(未测试...)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句