Python 使用“in”语句时元组vs列表vs字典

Python 使用“in”语句时元组vs列表vs字典,python,Python,我有一个小的if语句,它检查变量是否为两个值中的任何一个。通过测试,我可以看出以下三项都可以工作: var = 'a' if(var in ['a', 'b']): print("List") if(var in ('a', 'b')): print("Tuple") if(var in {'a', 'b'}): print("Dictionary") 但是,这里应该使用哪种数据结构?我认为在两个元素中,您不会真正注意到速度差异,所以我会选择最小的结构,tuple pytho

我有一个小的if语句,它检查变量是否为两个值中的任何一个。通过测试,我可以看出以下三项都可以工作:

var = 'a'

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

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

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

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

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

python-m timeit'a中的a,b' 10000000个循环,最佳3个:每个循环0.0216 usec python-m timeit'a in[a,b]' 10000000个循环,最佳3个:每个循环0.0218 usec python-m timeit'a在{a,b}' 10000000个循环,最好3个:每个循环0.0255 usec 要显示不同结构之间的尺寸差异,请执行以下操作:

导入系统 sys.getsizeof'a','b' 64 sys.getsizeof['a','b'] 80 sys.getsizeof{'a','b'} 224 编辑 正如@Torxed所指出的,内存使用和速度之间存在一种权衡。对于较小的元素组1-10,可以使用元组或列表,但让我们尝试使用一组100个元素:

-s*在这里没有时间 列表方法,1是最后给出的最坏情况 python-m timeit-s'var=[x代表范围100中的x][::-1]''var中的1' 1000000个循环,最好3个:每个循环0.947 usec 元组法 python-m timeit-s'var=tuple[x代表范围100中的x][::-1]''var中的1' 1000000个循环,最好为3个:每个循环0.944 usec 集合方法 python-m timeit-s'var=set[x代表范围100中的x][::-1]''var中的1' 10000000个循环,最好3个:每个循环0.0272 usec
在这种情况下,dict/set可以极大地提高存储速度,也就是说,为了提高速度,您可以放弃内存开销。首先,最后一个选项不是字典,而是集合。如果您来自C语言背景,请将其视为KeyValuePair


其次。元组在分配时速度非常快,因为它是不可变的,并且可以很容易地压缩

这是一个集合,而不是一个dict。仅{}不足以将某个东西称为dict。至于应该使用什么,set/dict查找速度很快。但是这些结构需要更多的内存来存储。因此,请做出相应的决定。第三个选项实际上是一个集合,而不是一个字典。这个程序的目的是什么?你应该花一些时间学习如何处理这样的内容并进行调查。如果你还想知道该怎么做的话,请在这之后做出决定并提出问题。对于两个值,我只需要写var=='a'或var=='b'。注意这一点非常重要:一些数据结构非常适合用于最多5-10项列表的枚举,元组等,因为有些结构擅长于较大的数字,所以dict对于较大的数量非常有用。在决定使用IMO的类型时,不同数据长度的计时是关键。这正是我想要的,谢谢!你是对的,对于2个元素来说,大小和速度都是可以忽略不计的,但是这对于将来更大尺寸的任何情况来说都是非常有趣的信息。谢谢@Aziz知道,在早期的Python版本中,元组优于5-10个元素,列表最快可达10-50个元素。在那之后,dicts在各种形状和形式上都更快。尤其是出于明显的原因访问对象。在这方面,内存消耗通常随速度而变化。我坚持我上面的评论,学会对大小和用例的差异进行计时。@即使长度达到100个元素,我也没有注意到在一个元组~1%的列表中有显著的性能提升。然而,在这个尺寸下,您是正确的,dict和set是远远更好的选择。我将在回答中添加一个编辑,以突出显示您的点集与C中的KeyValuePair完全不同?我对C语言很生疏,但您所描述的实际上是C语言中的dict?对于一个立即被垃圾收集的对象来说,可变性其实并不重要。