字典和集合都在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-=[];',.!@#$%^&*()")
使用字典的执行时间
已设置执行时间
答案 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
方法在循环外仅查找一次。