用于即时密钥迭代的python list与tuple

时间:2012-03-26 22:03:27

标签: python

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

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

请注意,如果将元组更改为列表,则上述操作将完全相同;我想知道是否有一些偏好。

5 个答案:

答案 0 :(得分:7)

如果您不打算对其进行更改,我认为元组更适用。当我需要对集​​合进行动态操作时,我只使用列表,如append,subtract等。

另外,在大多数情况下,访问元组的速度更快。话虽如此,您应该在决定之前测试您的具体用例。

答案 1 :(得分: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或汇编代码。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

for item in a, b:
    process(item)

我想知道在这种情况下究竟发生了什么:P

编辑:它转换为:

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

这似乎是一个元组......

答案 4 :(得分:1)

如果我理解你的问题,你会问在这种情况下使用什么惯用。 (性能和内存效率在这里几乎没有重要性,因为你说你只做了一次。)

答案是,对于Python的大部分存在,人们倾向于使用元组来抛弃常数,主要是因为习惯在无意改变时使用不可变的东西。

[编辑:摆脱一些关于集合的无关紧要的东西。当它实际上没有贡献时,我太急于把它变成答案。]

请注意,有时候声音少数人坚持列表。其基本原理是列表最初被设想为Python的“数组”类型,而元组是“记录”类型。也就是说,列表用于保存单个类型的多个对象(如测试分数集合),而元组用于保存任意相关对象(如名称,地址和电话号码)。但是,现在严格遵守这一点是古老而古怪的。