为什么Python中的“执行”操作比迭代列表要快?

时间:2018-12-02 00:04:50

标签: python iteration documentation

例如,我想确定列表A中是否有某个数字a。如果我使用return a in A,这比编写像这样的迭代函数要快得多

for number in A: 
    if a == number:
        return True

内幕是什么? Python是否使用其他方式来确定成员资格?我浏览了Python documentation,但找不到答案。

1 个答案:

答案 0 :(得分:0)

6.10.2。成员资格测试操作

对于列表,元组,集合,frozenset,dict或collections.deque等容器类型,表达式x in y等效于any(x is e or x == e for e in y)

对于字符串和字节类型,当且仅当x是y的子字符串时,x in y才是True。等效测试为y.find(x) != -1。空字符串始终被认为是任何其他字符串的子字符串,因此"" in "abc"将返回True

对于定义__contains__()方法的用户定义类,如果x in y返回真值,True返回y.__contains__(x),否则返回False

对于没有定义__contains__()但定义了__iter__()的用户定义类,如果x in y中包含某个值Truezx == z }是在y上迭代时产生的。如果在迭代过程中引发了异常,就好像in引发了该异常。

最后,尝试使用旧式的迭代协议:如果一个类定义了__getitem__(),则且仅当存在非负整数索引{{1时,x in y才是True }},这样i和所有较低的整数索引都不会引发IndexError异常。 (如果引发了任何其他异常,则好像引发了该异常一样。)

从Python官方页面上提取的信息:https://docs.python.org/3/reference/expressions.html