python - 为什么这个python Lark语法这么慢?
问题描述
我正在尝试解析“ypcat -k netgroup”的输出输出看起来像这种格式的许多行:
group1 (host1,user1,domain1) (host2,user2,domain2) (host3,user3,domain3) ...
或者有时
group2 groupa groupb groupc ...
我第一次尝试使用这个云雀语法:
def getNetgroups():
parser = Lark(ypcat_grammer)
res = subprocess.check_output(['ypcat -k netgroup'], shell=True).decode('utf-8')
print(parser.parse(res).pretty())
ypcat_grammer = r"""
?start: _line+
_line: groupname members NEWLINE
members: (member|groupname)*
member: "(" hostname? "," username? "," domainname? ")"
username: _name
domainname: _name
groupname: _name
hostname: _name
_name: /([a-zA-Z0-9_\.\-]+)/
%import common.WS_INLINE
%import common.NUMBER
%import common.NEWLINE
%ignore WS_INLINE
"""
解析 4000 行需要 60 秒!!?这似乎很长,所以我编写了一个手动编码的解析器:
member = re.compile('\(([^,]*),([^,]*),([^,]*)\)')
def parseNetGroups():
res = subprocess.check_output(['ypcat -k netgroup'], shell=True).decode('utf-8')
rows = []
for line in res.split('\n'):
words = re.split('\s+', line)
groupname = words.pop(0)
members = []
for word in words:
if m:=member.match(word):
members.append((m.group(1),m.group(2),m.group(3)))
else:
members.append(word)
rows.append({'GROUPNAME':groupname, 'MEMBERS':members})
return pd.DataFrame(rows)
这花了 0.8 秒。我究竟做错了什么?
解决方案
更改为 parser='lalr' 将运行时间减少到 3.8 秒。这对我来说已经足够了。
推荐阅读
- python - 如何将数据框转换为带有列表键的字典?
- python - 用于 mWebSocket 服务器的 Python WebSocket 客户端
- eclipse-plugin - 如何在 Eclipse 中将 checkstyle 降级到 8.40 或 8.41
- powershell - 我应该如何在我的 Windows Server 中创建一个防火墙表列表来显示端口 443 是否被阻止?
- javascript - 在运行 indented if block 之前防止单击两次
- shell - tmux中的`Ctrl b + d`和`Ctrl b + Ctrl z`有什么区别?
- javascript - 在 JSX 中为字符串添加选项卡
- amazon-cloudfront - 我可以在 cloudfront 中使用多个 index.html 吗?
- sql - JOIN 子句查找不重复的相关记录,导航外键链
- javascript - 是否有用于确认要上传的文件的事件侦听器?