尽管有缓存,调用re.compile的开销是巨大的。使用is_wanted_line = re.compile(r"DramBaseAddress\d+").search
for i, line in enumerate(open('rndcfg.cfg')):
if is_wanted_line(line):
j += 1
相反。在
更进一步,你可以
^{pr2}$
以进一步减少开销。在
您也可以考虑自己进行缓冲:key = b"DramBaseAddress"
is_wanted_line = re.compile(rb"DramBaseAddress\d+").search
with open("rndcfg.cfg", "rb") as file:
rest = b""
for chunk in iter(lambda: file.read(32768), b""):
i += chunk.count(b"\n")
chunk, _, rest = (rest + chunk).rpartition(b"\n")
if key in rest and is_wanted_line(chunk):
j += 1
if key in rest and is_wanted_line(rest):
j += 1
这样可以减少行分割和编码开销。(这并不完全相同,因为它不考虑每个块有多个实例。这样的行为相对来说比较简单,但在您的案例中可能并不严格需要。)
这有点重,但是如果删除i += chunk.count(b"\n"),它的速度是Perl-8x的三倍!在