我代码中的 for 循环是速度瓶颈吗?

Is the for loop in my code the speed bottleneck?

以下代码查看 2500 个 markdown 文件,共 76475 行,检查每个文件是否存在两个字符串。

#!/usr/bin/env python3
# encoding: utf-8

import re
import os

zettelkasten = '/Users/will/Dropbox/zettelkasten'

def zsearch(s, *args):
    for x in args:
        r = (r"(?=.* " + x + ")")
        p = re.search(r, s, re.IGNORECASE)
        if p is None:
            return None
    return s

for filename in os.listdir(zettelkasten):
    if filename.endswith('.md'):
        with open(os.path.join(zettelkasten, filename),"r") as fp:
            for line in fp:
                result_line = zsearch(line, "COVID", "vaccine")
                if result_line != None:
                    UUID = filename[-15:-3]
                    print(f'›[[{UUID}]] OR', end=" ")

这正确地给出了如下输出:

›[[202202121717]] OR ›[[202003311814]] OR 

,但在我的机器上 运行 几乎需要两秒钟,我认为这太慢了。如果有的话,可以做些什么来让它更快?

主要瓶颈是您正在构建的正则表达式。

如果我们 print(f"{r=}")zsearch 函数中:

>>> zsearch("line line covid line", "COVID", "vaccine")
r='(?=.* COVID)'
r='(?=.* vaccine)'

(?=.*) 前瞻是导致减速的原因 - 而且也不需要。

您可以通过搜索获得相同的结果:

r=' COVID'
r=' vaccine'