Python 3.x 在python中遍历列表或集合
我收到一条PR视图评论,建议我在for循环下使用set not list,有人知道为什么吗?因为我确信我的列表中没有重复的元素 ['nam1','name2']中的i的Python 3.x 在python中遍历列表或集合,python-3.x,Python 3.x,我收到一条PR视图评论,建议我在for循环下使用set not list,有人知道为什么吗?因为我确信我的列表中没有重复的元素 ['nam1','name2']中的i的 #{'name1','name2'中i的注释: #无论名称1或名称2的顺序如何,在i上执行操作 在某些情况下,如果python能够将其检测为“常量”,则python会自行将集优化为冻结集s if a in {"a","b","c"}: pass {“a”、“b”、“c”}将被优化为比常规集更便宜的冻结集 Pyt
#{'name1','name2'中i的注释:
#无论名称1或名称2的顺序如何,在i上执行操作
在某些情况下,如果python能够将其检测为“常量”,则python会自行将集
优化为冻结集
s
if a in {"a","b","c"}:
pass
{“a”、“b”、“c”}
将被优化为比常规集更便宜的冻结集
Python的窥视孔优化器现在将{1,2,3}中的
x等模式识别为一组常量的成员资格测试。这个
optimizer将该集合重铸为冻结集,并存储预构建的
不变的
但这是条件,不是循环
列表、集合和冻结集合具有不同的时间和空间需求set
s比纯列表有更多的开销,创建它们需要更多的时间,也需要更多的存储空间
若您确信源数据并没有重复项,并且不需要在set
s显示的地方进行任何查找,那个么列表就可以了
如有疑问,测量:
import timeit
for size in (4,40,400,4000,40000,400000,):
# using ints, so string-creation does not overrule container creation
def create_list(): return list(range(size))
def create_set(): return set (range(size))
def create_frozen(): return frozenset (range(size))
print(f"list ({size:>6}): ", timeit.timeit(create_list, number=100))
print(f"set ({size:>6}): ", timeit.timeit(create_set, number=100))
print(f"frozenset ({size:>6}): ", timeit.timeit(create_frozen, number=100))
list ( 4): 6.404200030374341e-05
set ( 4): 8.520600022166036e-05
frozenset ( 4): 6.208299964782782e-05 # win
list ( 40): 7.895299950178014e-05 # win
set ( 40): 0.00012057100047968561
frozenset ( 40): 0.00011847200039483141
list ( 400): 0.0003935449994969531 # win
set ( 400): 0.0009299020002799807
frozenset ( 400): 0.0009138610002992209
list ( 4000): 0.007811448000211385 # win
set ( 4000): 0.013984612000058405
frozenset ( 4000): 0.01376037299996824
list ( 40000): 0.10312434200022835 # win
set ( 40000): 0.16045320600005653
frozenset ( 40000): 0.15907835799953318
list (400000): 1.3602663640003811 # win
set (400000): 2.2382532829997217
frozenset (400000): 2.238473141999748
你为什么不问问评论者呢?我想你可以把这个问题改成类似“python中的列表与集合”的形式,让它不那么基于观点,但是这个问题已经被问了好几次了