我有一个小的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")
但是,这里应该使用哪种数据结构??
答案 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),可以使用tuple
或list
,但我们尝试使用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 <>。
第二。元组在分配时非常快,因为它是不可变的,并且很容易压缩。