【发布时间】:2017-06-07 09:06:29
【问题描述】:
好的,我目前有以下代码:
n = 0
with open('/home/user/test.filter') as f:
lines = f.readlines()
for l in lines:
if lines[n].startswith('-A vlan_8'):
if "-o bond1.8" in lines[n]:
f = open('vlan8.filter_in', 'a')
f.write(l)
else:
f = open('vlan8.filter_out', 'a')
f.write(l)
if lines[n].startswith('-A vlan_10'):
if "-o bond1.10" in lines[n]:
f = open('vlan10.filter_in', 'a')
f.write(l)
else:
f = open('vlan10.filter_out', 'a')
f.write(l)
if lines[n].startswith('-A vlan_15'):
if "-o bond1.15" in lines[n]:
f = open('vlan15.filter_in', 'a')
f.write(l)
else:
f = open('vlan15.filter_out', 'a')
f.write(l)
# [...]
n = n + 1
我考虑过使用一些累加器或列表来优化它,以使脚本不那么广泛。有什么建议吗?
【问题讨论】:
-
我认为你的标签在这个例子中有点不正确?
-
你的意思是优化(更快)还是重构(更少重复)?
-
首先,不要做
== True——这是多余的;如果==左边的表达式等于True,那么,嗯,这是真的。其次,由于您有多次重复的非常相似的代码,请考虑将其设为函数。第三,在开始时打开你的输出文件一次,而不是每次需要写入时都打开它们 - 你可以保留一个列表,或者更好的是,它们的字典。 -
您只能在循环之前打开文件(例如 vlan8.filter_in)一次,而不是针对您处理的每一行。此外,紧接在
for循环下的所有if子句(当然第一个除外)都可以转换为elifs。if lines[n].startswith不正确,应该是if lines.startswith,但我没有编辑它们以避免改变问题的语义。
标签: python for-loop optimization iteration