首页 > 解决方案 > 使用“in”语句时的元组 vs 列表 vs 字典

问题描述

我有一个小的 if 语句来检查变量是否是 2 个值中的一个。通过测试,我可以看到以下所有 3 个都可以工作:

var = 'a'

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

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

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

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

标签: python

解决方案


我认为超过两个元素,你不会真正注意到速度差异,所以我会选择最小的结构,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),a tupleorlist很好,但让我们尝试使用一组 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

在这种情况下,您会从/获得巨大的提升,那时您会放弃内存开销以提高速度dictset


推荐阅读