为什么字典需要的时间少于python中设置的时间?

时间:2019-01-21 04:41:25

标签: python python-3.x dictionary set hashtable

字典和集合都在Python中实现为哈希表,插入时间和查找时间均为O(1)。我正在编写一个程序来计算字符串是否由所有唯一字符组成,并且我正在使用一个程序来跟踪到目前为止看到的所有字符。我观察到的是,如果我使用字典而不是集合,则程序的总体运行时间会更快一些。谁能解释这个原因?

使用字典的代码:

def TestUniqueCharacters(characters):
    chars = {}
    for character in characters:
        if character not in chars:
            chars[character] = 1
        else:
            return False
    return True

for i in range(30000000):
    TestUniqueCharacters("qwertyuiopasdfghjklzxcvbnm1234567890-=[];',.!@#$%^&*()")

使用一组代码

def TestUniqueCharacters(characters):
    chars = set()
    for character in characters:
        if character not in chars:
            chars.add(character)
        else:
            return False
    return True

for i in range(30000000):
    TestUniqueCharacters("qwertyuiopasdfghjklzxcvbnm1234567890-=[];',.!@#$%^&*()")

使用字典的执行时间

Execution time with dictionary

已设置执行时间

Execution time with set

1 个答案:

答案 0 :(得分:4)

我不想花很多时间,因为dict和set的实现在Python版本中有所不同。追逐与版本有关的小谜团并不有趣;-)

所以我将建议更改:

chars = set()
for character in characters:
    if character not in chars:
        chars.add(character)

收件人:

chars = set()
charsadd = chars.add   # new line here
for character in characters:
    if character not in chars:
        charsadd(character)  # this line is different - no method lookup now

查看在您正巧使用的任何Python版本下会发生什么。

在原始chars.add(...)中,每次循环时,都必须在"add"对象上查找字符串名称为chars的方法,并创建一个绑定方法对象,即然后使用参数character进行调用。虽然这不是一笔大笔费用,但这不是免费的。在建议的重写中,add方法在循环外仅查找一次。