Эта версия быстрее, чем любые представленные примеры, за исключением того, что она на 20% медленнее, чем sorted(x) == sorted(y)
для коротких строк. Это зависит от вариантов использования, но обычно увеличение производительности на 20% недостаточно, чтобы оправдать усложнение кода при использовании другой версии для коротких и длинных строк (как в ответе @ patros).
Он не использует len
, поэтому он принимает любые итерации, поэтому он работает даже для данных, которые не помещаются в памяти, например, учитывая два больших текстовых файла с множеством повторяющихся строк, он отвечает, имеют ли файлы одинаковые строки (строки можно в любом порядке).
def isanagram(iterable1, iterable2):
d = {}
get = d.get
for c in iterable1:
d[c] = get(c, 0) + 1
try:
for c in iterable2:
d[c] -= 1
return not any(d.itervalues())
except KeyError:
return False
Неясно, почему эта версия быстрее, чем defaultdict
(@ namin's) для большой iterable1
(проверено на тезаурусе 25 МБ).
Если мы заменим get
в цикле на try: ... except KeyError
, тогда он будет работать в 2 раза медленнее для коротких строк, т. Е. При наличии нескольких дубликатов.