#!/usr/bin/env python2.5 from collections import defaultdict from itertools import izip import random def isAnagram(str1, str2): return sorted(str1) == sorted(str2) def isAnagramN(str1, str2): if len(str1) != len(str2): return False # early escape counts = defaultdict(lambda: [0, 0]) for c1, c2 in izip(str1, str2): counts[c1][0] += 1 counts[c2][1] += 1 for k, v in counts.iteritems(): if v[0] != v[1]: return False return True CHARS = [] for p in range(200001): CHARS.append(chr(random.randint(32, 126))) def generatePairs(l): s1 = ''.join(CHARS[:l]) s2 = ''.join(CHARS[:l]) return (s1, s2) def test(f, l): pair = generatePairs(l) assert True == f(pair[0], pair[1]) def testA(m): test(isAnagram, m) def testB(m): test(isAnagramN, m) if __name__ == '__main__': from timeit import Timer resultsA = [] resultsB = [] for i in range(1, 100002, 10000): t1 = Timer("testA(%d)" % i, "from __main__ import testA") t1r = t1.repeat(number=50) t2 = Timer("testB(%d)" % i, "from __main__ import testB") # resultsB.append((i, t2.repeat(number=10))) t2r = t2.repeat(number=50) print i, t1r[0], t2r[0], "generators" if t2r[0] < t1r[0] else "sort" # for a, b in zip(resultsA, resultsB): # j, k = a[1][0], b[1][0] # which = "generators" if k < j else "sort" # print a[0], j, k, which