python中一个非常常见的模式是:
for something in ['an', 'iterable']:
func(something)
我几乎总是将可迭代项视为一个列表(如本例中所示),但是它很可能是一个元组,集合或其他内容。列表是执行此操作的最高效,最Python化的方法吗?
类似地,我经常看到以下内容:
if something_else in ['another', 'iterable']:
func(something_else)
在这种情况下,我们实际上是在搜索以寻找something_else
(请注意,用if
而不是for
),如果迭代的话可能会更有效是一个集合(例如if x in {...}:
)。但是,对于很小的数量,这不一定是正确的。列表仍然是执行此操作的Python方法吗?
答案 0 :(得分:1)
忘记有关时间的参数,它们与您正在执行的操作无关,它们在不同的Python实现中可能会有所不同。最好对可读性进行优化
为回答您的问题,我相信该列表是最“ Pythonic”的列表。大多数Python开发人员几乎都使用列表,而没人会看您的代码并认为这很奇怪。列表方括号([ ]
)也非常独特,在浏览代码时很容易识别。括号({ }
)可以与字典混淆,初学者可能不熟悉该符号。元组括号很奇怪:Python到处都有括号,语法可能会令人困惑。例如:单个项目的元组需要逗号:('item',)
说过,“ Pythonic”就像跟随一种时尚:由于语言的变化,人们的变化,图书馆的变化等,如今流行的时尚在几年内可能不再流行。我非常喜欢使用“适当的”类型。您是在处理一组(从数学意义上来说)还是列表?如果是集合,请使用set
否则使用list
。
答案 1 :(得分:0)
我猜timeit
是一回事。结果如下:
$ python -m timeit "x=True if 'my_variable' in ['just', 'three', 'options'] else False"
10000000 loops, best of 3: 0.0643 usec per loop
$ python -m timeit "x=True if 'my_variable' in ('just', 'three', 'options') else False"
10000000 loops, best of 3: 0.0645 usec per loop
$ python -m timeit "x=True if 'my_variable' in {'just', 'three', 'options'} else False"
10000000 loops, best of 3: 0.113 usec per loop
更多选项:
$ python -m timeit "x=True if 'my_variable' in ['a', 'much', 'longer', 'list', 'of', 'choices', 'but', 'still', 'nothing', 'crazy', 'and', 'perhaps', 'you', 'could', 'actually', 'find', 'some', 'ridiculous', 'code', 'like', 'this', 'in', 'the', 'wild'] else False"
1000000 loops, best of 3: 0.264 usec per loop
$ python -m timeit "x=True if 'my_variable' in ('a', 'much', 'longer', 'list', 'of', 'choices', 'but', 'still', 'nothing', 'crazy', 'and', 'perhaps', 'you', 'could', 'actually', 'find', 'some', 'ridiculous', 'code', 'like', 'this', 'in', 'the', 'wild') else False"
1000000 loops, best of 3: 0.262 usec per loop
$ python -m timeit "x=True if 'my_variable' in {'a', 'much', 'longer', 'list', 'of', 'choices', 'but', 'still', 'nothing', 'crazy', 'and', 'perhaps', 'you', 'could', 'actually', 'find', 'some', 'ridiculous', 'code', 'like', 'this', 'in', 'the', 'wild'} else False"
1000000 loops, best of 3: 0.82 usec per loop
组合和列表的执行相同,并且显然比组合快。我想这是因为集合带来了更多的开销,因此,当N很小时,它们就不那么实用了。有关比较元组和列表的更多与性能相关的信息,请参见Are tuples more efficient than lists in Python?
上的各种答案。至于风格,我认为没有任何区别。
答案 2 :(得分:0)
鉴于s g表示没有显着差异,列表可能更可取。 列表用法在某种程度上更为常见,因此更为传统,方括号可以说比集合括号更能被识别为一个集合,而圆括号用于更多的事情。