Python 嵌套for循环的性能较慢

Python 嵌套for循环的性能较慢,python,python-3.x,Python,Python 3.x,我有一个相当大的文本文件~16k行,我正在对每行循环,检查行中是否存在客户端IP:Port、服务器IP:Port和关键字,使用两个for循环和嵌套的if x in line语句检查行中是否包含我要查找的信息 在识别出包含我要查找的值的行之后,我将更新sqlite DB。最初,由于我没有将SQL UPDATE语句包装在手动事务中,所以这需要相当长的时间来执行。在进行此更改之后,执行时间显著提高,但是我仍然发现下面的代码需要几分钟才能完成,我觉得我糟糕的循环结构是原因 如果任何人有任何性能提示来帮助

我有一个相当大的文本文件~16k行,我正在对每行循环,检查行中是否存在客户端IP:Port、服务器IP:Port和关键字,使用两个for循环和嵌套的if x in line语句检查行中是否包含我要查找的信息

在识别出包含我要查找的值的行之后,我将更新sqlite DB。最初,由于我没有将SQL UPDATE语句包装在手动事务中,所以这需要相当长的时间来执行。在进行此更改之后,执行时间显著提高,但是我仍然发现下面的代码需要几分钟才能完成,我觉得我糟糕的循环结构是原因

如果任何人有任何性能提示来帮助加速以下代码,我将不胜感激:

c.execute("SELECT client_tuple, origin_tuple FROM connections")
# returns ~ 8k rows each with two items, clientIP:port and serverIP:port
tuples = c.fetchall()

with open('connection_details.txt', 'r') as f:
    c.execute('BEGIN TRANSACTION')
    # for each line in ~16k lines
    for line in f:
        # for each row returned from sql query
        for tuple in tuples:
            # if the client tuple (IP:Port) is in the line
            if tuple[0] in line:
                # if the origin tuple (IP:Port) is in the line
                if tuple[1] in line:
                    # if 'foo' is in the line
                    if 'foo' in line:
                        # lookup some value and update SQL with the value found
                        bar_value = re.findall(r'(?<=bar\s).+?(?=\,)', line)
                        c.execute("UPDATE connections "
                                    " SET bar = ? "
                                   "WHERE client_tuple = ? AND origin_tuple = ?",
                                    (bar_value[0], tuple[0], tuple[1]))

    conn.commit()
对于For循环,您可以使用itertools,并可以将if语句转换为单个语句,如下所示:

import itertools

for line, tuple in itertools.product(f, tuples):
    if tuple[0] in line and tuple[1] in line and 'foo' in line:
对于For循环,您可以使用itertools,并可以将if语句转换为单个语句,如下所示:

import itertools

for line, tuple in itertools.product(f, tuples):
    if tuple[0] in line and tuple[1] in line and 'foo' in line:

不幸的是,您无法收紧for循环,因为您需要迭代文件中每一行的所有元组。但是,您可以通过合并if语句稍微收紧代码。在遍历所有元组之前,您可能应该检查“foo”是否存在

with open('connection_details.txt', 'r') as f:
    c.execute('BEGIN TRANSACTION')
    # for each line in ~16k lines
    for line in f:
        # for each row returned from sql query
        if 'foo' in line:
            for tup in tuples:
                if tup[0] in line and tup[1] in line:

不幸的是,您无法收紧for循环,因为您需要迭代文件中每一行的所有元组。但是,您可以通过合并if语句稍微收紧代码。在遍历所有元组之前,您可能应该检查“foo”是否存在

with open('connection_details.txt', 'r') as f:
    c.execute('BEGIN TRANSACTION')
    # for each line in ~16k lines
    for line in f:
        # for each row returned from sql query
        if 'foo' in line:
            for tup in tuples:
                if tup[0] in line and tup[1] in line:
如果在tuples:iterator中tuple的前面应该是line:check中的'foo',那么您将自动跳过不需要处理的行

第二个小改进-在循环之外使用编译匹配器。

如果“foo”在line:check之前应该在tuple:iterator中查找tuple,那么您将自动跳过不需要处理的行


第二个小改进-在循环之外,使用编译的matcher。

您应该尽量避免使用tuple作为变量名,因为它是一个内置函数。发布一个关于行外观的示例以及fetchall中的示例tuple将对您有很大帮助。+您可能需要查看任意、所有和集合,因为它们具有非常快的成员资格测试。Definition的嵌套循环非常慢。代码调整不会让你在这些方面走得很远。您需要修复算法。另一个想法是从文本文件创建SQL数据库,并使用连接更新原始表,因此您应该尽量避免使用tuple作为变量名,因为它是一个内置函数。发布一个关于行外观的示例和fetchall中的一个示例元组将对我们帮助很大您可能需要查看任意、所有和集合,因为它们具有非常快的成员资格测试。Definition的嵌套循环非常慢。代码调整不会让你在这些方面走得很远。你需要修正你的算法。另一个想法是从文本文件创建一个SQL数据库,并使用连接更新原始表,等等!我对if语句进行了重新排序,代码执行时间减少了一半,这是因为在tuples循环中输入for tuple的行数减少了。我还根据@James suggestion将两个if-tup[x]行合并为一个语句。接下来我将研究如何编译regexp,以提高性能。那很有帮助,谢谢你!我对if语句进行了重新排序,代码执行时间减少了一半,这是因为在tuples循环中输入for tuple的行数减少了。我还根据@James suggestion将两个if-tup[x]行合并为一个语句。接下来我将研究如何编译regexp,以提高性能。这很有帮助。