Performant在1.5 mio元素列表中重复搜索

时间:2017-05-11 06:29:10

标签: python performance list

如果可能的话,我正在寻找能够获得更好性能的解决方案:

我有一个router_port描述列表(大约1.5百万)和要查找的模式列表(大约30000个元素)

router_port列表中的元素如下所示:

['tgn-11-2-ho\TenGigE0\7\GGH-12JH-SE\Te22\SFP-10G\Te22']

pattern_list中的一个元素,如:

('tgn-11-2-ho', 'GGH-12JH')

规则是,元组的第一部分必须位于router_port元素的开头,第二部分可以位于router_port的任何位置。

实际上我按以下方式搜索:

def search_for_pattern(pattern1, pattern2):
    pos_list = [position for position, port in enumerate(router_port) 
                if port.startswith(pattern1) and pattern2 in port]
    return pos_list

工作正常,但由于它会产生30000个循环,需要一段时间才能完成。

使用python 3.5有更有效的方法吗?

1 个答案:

答案 0 :(得分:1)

如何在读取路由器端口文件时构建此数据结构:

function exp_script() {
wp_enqueue_script( 'script_name', get_template_directory_uri() . '/js/script_file.js', array( 'jquery' ), '1.0.0', true );
}

add_action( 'wp_enqueue_scripts', 'exp_script' );

现在你可以做到

port_info = dict()

def process_port(line_num, port_desc):
    parts = port_desc.split("\\")
    head = parts[0]

    try:
        port_head_info = port_info[head]
    except KeyError:
        port_head_info = dict()
        port_info[head] = port_head_info

    for i, part in enumerate(parts):
        if i == 0:
            continue
        try:
            port_head_info[part].append(line_num)
        except KeyError:
            port_head_info[part] = [line_num]

with open('router_ports', 'r', encoding='utf8') as f:
    for line_num, line in enumerate(f, 1):
        process_port(line_num, line)