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