如何在Python中有效地循环三种不同的数据收集?

如何在Python中有效地循环三种不同的数据收集?,python,performance,list,Python,Performance,List,实现以下目标的最佳/最快方法是什么:我有一个大文件需要更新。我不会把它载入内存,而是像这样一行一行地读 with open(self.f, "rb") as f_in: for line in f_in: l = line.strip().split(',') 对于每一行,可能有两种不同的更新场景。也就是说,两个包含更新信息的大型列表/元组。对于每一行,我必须检查,比如说l[0],是否满足列表1中的条件,如果不满足,则检查列表2中的另一个条件。我想知道在

实现以下目标的最佳/最快方法是什么:我有一个大文件需要更新。我不会把它载入内存,而是像这样一行一行地读

with open(self.f, "rb") as f_in:
        for line in f_in:
            l = line.strip().split(',')

对于每一行,可能有两种不同的更新场景。也就是说,两个包含更新信息的大型列表/元组。对于每一行,我必须检查,比如说
l[0]
,是否满足列表1中的条件,如果不满足,则检查列表2中的另一个条件。我想知道在这里什么是明智的,因为我可能会遇到性能问题。我的第一个想法是从列表/元组中删除匹配的项,以便随着运行时间的推移,列表变得越来越小

要根据一系列值测试成员资格,请使用
集合
而不是列表

与字典查找一样,集合成员资格测试也是O(1)操作。价格便宜,与电视机的大小无关

set_one = {'some_value', 'some_other_value', ...}

# ...
if l[0] in set_one:
    # do something.
如果需要映射值,请使用字典:

dict_one = {'some_value': 'item1', 'some_other_value': 'item2', ...}

# ...
if l[0] in dict_one:
    item = dict_one[l[0]]

这完全取决于您正试图执行的查找类型;使用正确的数据结构可以使许多不同类型的查找非常有效。在文件中的每一行的大列表上循环通常不是最好的选择。

要根据一系列值测试成员资格,请使用
集而不是列表

与字典查找一样,集合成员资格测试也是O(1)操作。价格便宜,与电视机的大小无关

set_one = {'some_value', 'some_other_value', ...}

# ...
if l[0] in set_one:
    # do something.
如果需要映射值,请使用字典:

dict_one = {'some_value': 'item1', 'some_other_value': 'item2', ...}

# ...
if l[0] in dict_one:
    item = dict_one[l[0]]

这完全取决于您正试图执行的查找类型;使用正确的数据结构可以使许多不同类型的查找非常有效。对于文件中的每一行,在大型列表上循环通常不是最好的选择。

此外,一旦使用了,您不必从集合中删除任何内容,只需将其保留在其中就更便宜了。@JasonOrendorff:yup,这就是我明确提到查找成本与集合大小无关的原因。@JasonOrendorff,除非出于某种原因,一旦找到匹配项,就不应再将其视为匹配项。@JasonOrendorff:也就是说,删除项目也会带来O(1)成本。但是为了加快查找而删除项目是没有意义的。那么你需要在问题中明确这一点。你需要为这些使用不同的结构;将
a
映射到
b
的字典将具有与
相同的性能指标,用于成员资格测试,但也将允许您访问值
b
。此外,一旦使用了该集,您不必删除其中的任何内容,只需将其保留在其中就更便宜了。@JasonOrendorff:yup,这就是我明确提到查找成本与集合大小无关的原因。@JasonOrendorff,除非出于某种原因,一旦找到匹配项,就不应再将其视为匹配项。@JasonOrendorff:也就是说,删除项目也会带来O(1)成本。但是为了加快查找而删除项目是没有意义的。那么你需要在问题中明确这一点。你需要为这些使用不同的结构;将
a
映射到
b
的字典将具有与
相同的性能指标,用于成员资格测试,但也将允许您访问值
b