list.index(值,开始,结束)的效率如何?

时间:2016-10-02 10:05:51

标签: python list indexof

今天我意识到python的list.index也可以选择start(甚至是end)参数。

我想知道这是否有效实施以及这两者中的哪一个更好:

pattern = "qwertyuytresdftyuioknn"
words_list = ['queen', 'quoin']
for word in words_list:
    i = 1
    for character in word:
        try:
            i += pattern[i:].index(character)
        except ValueError:
            break
        else:
            yield word

pattern = "qwertyuytresdftyuioknn"
words_list = ['queen', 'quoin']
for word in words_list:
    i = 1
    for character in word:
        try:
            i = pattern.index(character, i)
        except ValueError:
            break
        else:
            yield word

基本上i += pattern[i:].index(character) vs i = pattern.index(character, i)

generic_search_machine 上搜索此内容没有任何帮助,除了很多初学者教程试图教我列表是什么。

背景 此代码尝试查找words_list中匹配pattern的所有字词。 pattern是用户通过在键盘上滑动输入的字符列表,就像在大多数现代移动设备的键盘上一样。

在实际实现中,还有一个要求,即返回的单词应该超过5个字符,并且第一个和最后一个字符必须完全匹配。为简洁起见,这里省略了这些行,因为它们实现起来很简单。

1 个答案:

答案 0 :(得分:3)

这会调用在C:

中实现的内置函数
i = pattern.index(character, i)

即使没有查看source code,您也可以始终假设底层实现足够智能,可以有效地实现它,即它不会查看列表中的第一个i值。 / p>

根据经验,使用内置功能总是比您自己实现的最好的事情更快(或至少快)。

尝试做得更好:

i += pattern[i:].index(character)

这无疑更糟糕。它会生成 <{strong> pattern[i:]副本,然后在其中查找character

因此,在最坏的情况下,如果您的pattern为1 GB且i=1,则会在内存中复制1 GB的数据,以尝试跳过第一个元素(已被跳过)反正)。