字典和集合在 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 方法仅在循环外查找一次。
