2012-03-26 74 views
3

假设我有需要遍历的组件,例如“From”和“To”。为了方便起见,我可以遍历这些字符串,但是我不需要将它们存储一段时间,因为我只需要这样做一次。在这种情况下使用列表或元组会更好吗?Python列表与元组的实时按键迭代

info = {} 
for type in ('from', 'to'): 
    info[type] = fetch(type); 

注意上面将工作完全一样,如果元组改为列表;我想知道是否有一些偏好。

+1

这可能是内容丰富的:http://stackoverflow.com/questions/68630/are-tuples-more-efficient-than-lists-in-python – Hamish 2012-03-26 22:05:20

回答

7

如果你不打算对它进行更改,我认为一个元组应用更好。我只在需要对集合进行动态操作时使用列表,例如追加,减去等。

另外,在大多数情况下,访问元组的速度更快。这就是说你应该在决定之前总是测试你的特定用例。

7

元组最有可能更高性能,因为它们是不可变的。拆卸也表明,少操作码与一个元组使用:

2   0 SETUP_LOOP    14 (to 17) 
       3 LOAD_CONST    3 (('a', 'b')) 
       6 GET_ITER 

VS

2   0 SETUP_LOOP    20 (to 23) 
       3 LOAD_CONST    1 ('a') 
       6 LOAD_CONST    2 ('b') 
       9 BUILD_LIST    2 
      12 GET_ITER 

它并不真正的问题不过,如果性能事项位,你应该写C语言或汇编代码代替。

1

元组内存显然更小,创建速度更快,但有1或2个项目,我无法想象在99.99%的情况下它的重要性如何。

1

元组可能比在这种情况下列表更好,但你也可以做

for item in a, b: 
    process(item) 

我想知道什么是真正发生在这种情况下:P

编辑:它翻译成:

3 LOAD_CONST    3 (('a', 'b')) 

这似乎是一个元组...

+0

它创建了一个元组。 – 2012-03-26 22:09:29

+0

这只是一个稍微不同的sintax来表示问题已经存在的元组。 – vascop 2012-03-26 22:10:05

+4

元组不是由'()'创建的,因为许多人认为是由'',''创建的 - 但是,如果没有'()',它只会混淆人们。 – ThiefMaster 2012-03-26 22:10:14

1

如果我理解你的questio n正确,你问的是什么是最常用的在这种情况下使用。 (性能和存储效率几乎没有任何重要性在这里,因为你说你只是做一次。)

答案是,对于大多数Python的存在,人们倾向于使用一次性常量元组遍历,主要因为习惯于在无意改变它的时候使用不变的东西。

[编辑:摆脱了一些关于套的不相干的东西。当我没有真正的贡献时,我太急于将它解决问题的答案。]

请注意,有时会有一个声音少数坚持列表。其基本原理是列表最初被设想为Python的“数组”类型,而元组则是“记录”类型。也就是说,列表是为了容纳单个类型的多个对象(如测试分数的集合),而元组则是为了容纳任意相关的对象(如姓名,地址和电话号码)。尽管如此,严格遵守这个标准现在已经是一种古老而古怪的了。

+0

你对我的问题的理解完全正确。为什么在这种情况下,将* set literal *语法比tuple优先(我认为它更丑陋)? – 2012-03-26 23:56:09

+1

@tandu:对不起,它实际上不会在这种情况下。我从我的答案中编辑了这些材料,因为的确,它既不合理也不常用。 (人们做*喜欢使用设置文字,他们传统上使用元组,是测试一个小的,不变的值集合中的成员资格。) – 2012-03-27 02:07:40