python - 使用“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")
但是,这里应该使用哪种数据结构?
解决方案
我认为超过两个元素,你不会真正注意到速度差异,所以我会选择最小的结构,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 tuple
orlist
很好,但让我们尝试使用一组 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
推荐阅读
- ios - 如何在swift 5中解析xml并将xml数据填充到UITableview中?
- python - 创建一个标识一系列列的行为的新列
- r - 计数高于阈值范围的值
- javascript - 如何将硬编码的参数更改为用户的输入值,然后将函数的结果呈现到新页面?
- javascript - 为什么执行这部分javascript代码?
- wordpress - 如何在 WordPress 中添加 Instagram - 我的网站是使用 Elementor 构建的
- apache-flink - org.apache.flink.table.sources.CsvBatchTableSourceFactory 不支持的属性键:schema.#.proctime
- javascript - 在地图框中显示标记的标题或描述(NOT POPUP)
- python - Python / pandas:创建数据框的列并根据在另一个数据框范围内找到列值来设置它的值
- android - Flutter Build Error:无法确定任务':app:compileDebugJavaWithJavac的依赖关系