我代码中的 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'
以下代码查看 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'