提高字符串过滤器的效率

时间:2019-01-02 20:49:38

标签: 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。我的目标是搜索标题包含特定字符串部分的元素,并读出这些元素的值。

此刻,我采用一种相当简单的方法:将整个文件作为字符串打开/读取,将其区分为元素列表,并使用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()

1 个答案:

答案 0 :(得分:1)

是的,有。您必须避免测试string是否包含字符串,而应专注于字符串 quality

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

key_set = {"fgddd","#j"}

for st in cn:
    if '=' in st:
       key,value = st.split("=",1)
       if key in key_set:
           el = value.strip()
           yield float(el)

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

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模块进行解析变得微不足道,并且可以通过与我所示相同的方式来实现过滤。