【问题标题】:How efficient is list.index(value, start, end)?list.index(value, start, end) 的效率如何?
【发布时间】:2016-10-02 10:05:50
【问题描述】:

今天我意识到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个字符,并且首尾字符要完全匹配。为简洁起见,这里省略了这些行,因为它们实现起来很简单。

【问题讨论】:

  • 只是在我的机器上用更长的随机模式运行基本测试,第二种方法,使用index()start 参数,大约快5个数量级。当需要速度时,信任内置的底层 C 实现通常是安全的,而不是重新发明轮子。
  • 查尔斯所说的。第一种方式主要是较慢,因为它必须在每个循环上构造一个新的pattern[i:] 字符串对象。

标签: python list indexof


【解决方案1】:

这调用了一个用 C 实现的内置函数:

i = pattern.index(character, i)

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

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

改进的尝试:

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

这肯定更糟。它制作了pattern[i:]副本,然后在其中查找character

因此,在最坏的情况下,如果您有 1 GB 的 patterni=1,这会在内存中复制 1 GB 的数据以尝试跳过第一个元素(无论如何都应该跳过)。

【讨论】:

    猜你喜欢
    • 2019-09-07
    • 2021-07-04
    • 2013-03-02
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多