为什么dictionary比python中的set花费更少的时间?

为什么dictionary比python中的set花费更少的时间?,python,python-3.x,dictionary,set,hashtable,Python,Python 3.x,Dictionary,Set,Hashtable,字典和集合在Python中都实现为哈希表,插入时间和查找时间均为O(1)。我正在编写一个程序来计算字符串是否由所有唯一的字符组成,并且我正在使用一个集合来跟踪到目前为止看到的所有字符。我观察到的是,如果我使用字典而不是集合,程序的总体运行时间会快一点。谁能给我解释一下原因吗 使用字典进行编码: def TestUniqueCharacters(characters): chars = {} for character in characters: if chara

字典和集合在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-=[];',.!@#$%^&*()")
字典执行时间

带集合的执行时间


我不想在这方面花费太多时间,因为dict和set的实现在不同的Python版本中有所不同。追查版本相关的小秘密并没有多大乐趣;-)

因此,我建议改变一下:

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

看看在您使用的Python版本下会发生什么


在原始
chars.add(…)
中,每次通过循环,必须在
chars
对象上查找字符串名为
“add”
的方法,并创建一个绑定方法对象,然后使用参数
character
调用该对象。虽然这不是一项重大开支,但也不是免费的。在建议的重写中,
add
方法只在循环外查找一次。

我不想在这方面花费太多时间,因为dict和set的实现在不同的Python版本中有所不同。追查版本相关的小秘密并没有多大乐趣;-)

因此,我建议改变一下:

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

看看在您使用的Python版本下会发生什么


在原始
chars.add(…)
中,每次通过循环,必须在
chars
对象上查找字符串名为
“add”
的方法,并创建一个绑定方法对象,然后使用参数
character
调用该对象。虽然这不是一项重大开支,但也不是免费的。在建议的重写中,
add
方法只在循环外查找一次。

在进行比较之前,您是否定义了误差范围?它是否大于结果的差异?在进行比较之前,您是否定义了误差幅度?这比结果的差异大吗?嗨,非常感谢你的建议。它确实大大缩短了执行时间。套路的平均执行时间从我之前的2分钟20秒下降到1分钟45秒。嗨,非常感谢你的建议。它确实大大缩短了执行时间。集合的平均执行时间现在从我之前得到的大约2分钟20秒下降到1分钟45秒。