Python 提高字符串过滤器的效率

Python 提高字符串过滤器的效率,python,python-3.x,performance,filter,Python,Python 3.x,Performance,Filter,我有一个包含许多字符串的长文本文件。以下是文件的一部分: tyh89= 13 kb2= 0 78%= yes ##@bb1= 7634.0 iih54= 121 fgddd= no #aa1= 0 #aa2= 1 #$ac3= 0 yt#@hh= 0 #j= 12.1 ##hf= no 因此,基本上所有元素都有一个共同的结构:header=value。我的目标是搜索元素,其标题包含特定的字符串部分,并读取这些元素的值 一开始,我用一种相当直接的方法:将整个文件作为字符串打开/读取,将其区分为元

我有一个包含许多字符串的长文本文件。以下是文件的一部分:

tyh89= 13
kb2= 0
78%= yes
##@bb1= 7634.0
iih54= 121
fgddd= no
#aa1= 0
#aa2= 1
#$ac3= 0
yt#@hh= 0
#j= 12.1
##hf= no
因此,基本上所有元素都有一个共同的结构:
header=value
。我的目标是搜索元素,其标题包含特定的字符串部分,并读取这些元素的值

一开始,我用一种相当直接的方法:将整个文件作为字符串打开/读取,将其区分为元素列表,并使用for循环对所有元素运行if/elif条件。我在下面提供我的代码

这是最有效的方法吗?或者有没有更有效的方法不实现循环?

def main():
    print(list(import_param()))

def import_param():
    fl = open('filename','r')
    cn = fl.read()
    cn = cn.split('\n')
    fl.close()
    for st in cn:
        if 'fgddd' in st:
            el = st.split(' ')
            yield float(el[1])
        elif '#j' in st:
            el = st.split(' ')
            yield float(el[1])    

if __name__ == '__main__': main()

是的,有。您必须避免测试字符串是否包含字符串,而是关注字符串相等性

一旦满足相等条件,这意味着您可以使用已知关键字创建一个集合,根据
=
进行拆分,并测试该集合是否包含您的值(使用
O(1)
查找):

如果您有不同的类型,请使用字典根据键转换为正确的类型

key_set = {"fgddd":float ,"#j": float, "whatever":int , "something":str}

for st in cn:
    if '=' in st:
       key,value = st.split("=",1)
       if key in key_set:
           el = value.strip()
           yield key_set[key](el)  # apply type conversion
请注意,如果您不希望进行任何转换,
str
将执行此操作,因为当传递字符串时,它将返回自身


最后一点注意:如果您对输入格式有发言权,建议使用
json
而不是自定义格式。使用
json
module解析变得很简单,过滤可以通过我所展示的相同方式实现。

它有助于将所有测试语句组织在一起。但它仍然包括逐个循环整个列表元素。这是唯一的办法吗?
key_set = {"fgddd":float ,"#j": float, "whatever":int , "something":str}

for st in cn:
    if '=' in st:
       key,value = st.split("=",1)
       if key in key_set:
           el = value.strip()
           yield key_set[key](el)  # apply type conversion