使用“ in”语句时,元组,列表,字典对

时间:2019-02-26 20:21:05

标签: python

我有一个小的if语句,用于检查变量是否为2个值之一。通过测试,我可以看到以下所有三个都可以正常工作:

var = 'a'

if(var in ['a', 'b']):
  print("List")

if(var in ('a', 'b')):
  print("Tuple")

if(var in {'a', 'b'}):
  print("Dictionary")

但是,这里应该使用哪种数据结构??

2 个答案:

答案 0 :(得分:1)

我认为在两个元素上,您不会真正注意到速度差异,因此我选择了最小的结构tuple

python -m timeit '"a" in ("a","b")'
10000000 loops, best of 3: 0.0216 usec per loop

python -m timeit '"a" in ["a","b"]'
10000000 loops, best of 3: 0.0218 usec per loop

python -m timeit '"a" in {"a","b"}'
10000000 loops, best of 3: 0.0255 usec per loop

要显示不同结构之间的尺寸差异:

import sys 

sys.getsizeof(('a','b'))
64

sys.getsizeof(['a','b'])
80

sys.getsizeof({'a','b'})
224

编辑

正如@Torxed指出的那样,在内存使用和速度之间需要权衡。对于较小的元素组(1-10),可以使用tuplelist,但我们尝试使用100个元素组:


# -s *doesn't* get timed here
# list approach, 1 is last giving worst-case scenario
python -m timeit -s 'var = [x for x in range(100)][::-1]' '1 in var'
1000000 loops, best of 3: 0.947 usec per loop

# tuple approach
python -m timeit -s 'var = tuple([x for x in range(100)][::-1])' '1 in var'
1000000 loops, best of 3: 0.944 usec per loop

# set approach
python -m timeit -s 'var = set([x for x in range(100)][::-1])' '1 in var'
10000000 loops, best of 3: 0.0272 usec per loop

在这种情况下,您从dict / set获得了 mass 提升,那就是您为了速度而放弃了内存开销

答案 1 :(得分:0)

首先,最后一个选项不是字典,而是一个集合。如果您来自C#背景,请将其视为KeyValuePair <>。

第二。元组在分配时非常快,因为它是不可变的,并且很容易压缩。