list.index(value, start, end) 的效率如何?
How efficient is list.index(value, start, end)?
今天我意识到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)
与 i = pattern.index(character, i)
。
在 generic_search_machine returns 上搜索这个没有任何帮助,除了很多初学者教程试图教我列表是什么。
背景:
此代码尝试从 words_list
中找到与 pattern
匹配的所有单词。 pattern
是用户通过在键盘上滑动输入的字符列表,就像在大多数现代移动设备的键盘上一样。
在实际实现中还有一个要求,就是返回的单词长度要大于5个字符,首末字符必须完全匹配。为简洁起见,此处省略了这些行,因为它们实现起来很简单。
这会调用在 C:
中实现的内置函数
i = pattern.index(character, i)
即使不查看 source code,您始终可以假设底层实现足够智能,可以有效地实现它,即它不会查看列表中的第一个 i
值.
根据经验,使用内置功能总是比您自己实现的最好的东西快(或至少一样快)。
努力让它变得更好:
i += pattern[i:].index(character)
这绝对更糟。它制作了 pattern[i:]
的 副本,然后在其中查找 character
。
因此,在最坏的情况下,如果您有 1 GB 的 pattern
和 i=1
,这会在内存中复制 1 GB 的数据以试图跳过第一个元素(应该有无论如何都被跳过了)。
今天我意识到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)
与 i = pattern.index(character, i)
。
在 generic_search_machine returns 上搜索这个没有任何帮助,除了很多初学者教程试图教我列表是什么。
背景:
此代码尝试从 words_list
中找到与 pattern
匹配的所有单词。 pattern
是用户通过在键盘上滑动输入的字符列表,就像在大多数现代移动设备的键盘上一样。
在实际实现中还有一个要求,就是返回的单词长度要大于5个字符,首末字符必须完全匹配。为简洁起见,此处省略了这些行,因为它们实现起来很简单。
这会调用在 C:
中实现的内置函数i = pattern.index(character, i)
即使不查看 source code,您始终可以假设底层实现足够智能,可以有效地实现它,即它不会查看列表中的第一个 i
值.
根据经验,使用内置功能总是比您自己实现的最好的东西快(或至少一样快)。
努力让它变得更好:
i += pattern[i:].index(character)
这绝对更糟。它制作了 pattern[i:]
的 副本,然后在其中查找 character
。
因此,在最坏的情况下,如果您有 1 GB 的 pattern
和 i=1
,这会在内存中复制 1 GB 的数据以试图跳过第一个元素(应该有无论如何都被跳过了)。