Skip to main content
 首页 » 编程设计

python之为什么字典花费的时间比在 python 中设置的时间少

2025年05月04日21del

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

字典的执行时间

设置的执行时间

请您参考如下方法:

我不想在这上面花太多时间,因为字典和集合的实现因 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 对象,并创建一个绑定(bind)方法对象,然后用参数 character 调用它。虽然不是大笔费用,但也不是免费的。在建议的重写中,add 方法仅在循环外查找一次。