【发布时间】:2010-09-14 06:27:22
【问题描述】:
我有一个包含字符串列表的配置文件。我需要按顺序读取这些字符串并将它们存储在内存中,当某些事件发生时,我将多次迭代它们。因为一旦从文件中读取它们我就不需要添加或修改列表,元组似乎是最合适的数据结构。
但是,我对首先构造元组的最佳方式有点困惑,因为它是不可变的。我应该把它们解析成一个列表然后把它们放在一个元组中吗?这很浪费吗?有没有办法让它们首先进入一个元组,而无需每次添加新元素时复制/销毁元组的开销。
【问题讨论】:
我有一个包含字符串列表的配置文件。我需要按顺序读取这些字符串并将它们存储在内存中,当某些事件发生时,我将多次迭代它们。因为一旦从文件中读取它们我就不需要添加或修改列表,元组似乎是最合适的数据结构。
但是,我对首先构造元组的最佳方式有点困惑,因为它是不可变的。我应该把它们解析成一个列表然后把它们放在一个元组中吗?这很浪费吗?有没有办法让它们首先进入一个元组,而无需每次添加新元素时复制/销毁元组的开销。
【问题讨论】:
正如你所说,你将逐渐读取数据 - 所以元组毕竟不是一个好主意,因为它是不可变的。
是否有理由不使用简单的列表来保存字符串?
【讨论】:
由于您的数据正在发生变化,我不确定您是否需要一个元组。列表应该没问题。
请看下面的内容,它应该为您提供更多信息。分配一个元组比分配一个列表要快得多。但是,如果您不时尝试修改元素,那么创建元组可能就没有意义了。
【讨论】:
我不会担心首先创建一个列表然后从该列表中创建一个元组的开销。我的猜测是,如果你测量它,开销将可以忽略不计。
另一方面,我会坚持使用列表并对其进行迭代,而不是创建一个元组。元组应该用于数据结构之类的数据和数据列表的列表,这就是你的数据听起来像我。
【讨论】:
with open("config") as infile:
config = tuple(infile)
【讨论】:
config = tuple(line.rstrip() for line in infile) 几乎一样简单。
您可能想尝试使用链式生成器来创建您的元组。您可以使用生成器对输入执行多个过滤和转换操作,而无需创建中间列表。所有生成器处理都延迟到迭代。在下面的示例中,处理/迭代都发生在最后一行。
像这样:
f = open('settings.cfg')
step1 = (tuple(i.strip() for i in l.split(':', 1)) for l in f if len(l) > 2 and ':' in l)
step2 = ((l[0], ',' in l[1] and 'Tag' in l[0] and l[1].split(',') or l[1]) for l in step1)
t = tuple(step2)
【讨论】: