fork download
  1. import random, string
  2. from collections import Counter, defaultdict
  3. import operator
  4. from itertools import groupby, chain
  5. from timeit import timeit
  6.  
  7.  
  8. def rndstr(len):
  9. return ''.join(random.choice(string.letters) for i in xrange(len))
  10.  
  11. def rnditem():
  12. return (rndstr(20), random.randint(1, 1000))
  13.  
  14.  
  15. a=[("13.5",100)]
  16. b=[("14.5",100), ("15.5", 100)]
  17. c=[("15.5",100), ("16.5", 100)]
  18. input=[a,b,c]
  19.  
  20. dim = 80
  21. input = [[rnditem() for i in xrange(dim)] for j in xrange(dim)]
  22.  
  23.  
  24. def r(x,y):
  25. x += y
  26. return x
  27.  
  28. def kos(input):
  29. return reduce(operator.add, (Counter(dict(x)) for x in input))
  30.  
  31. def initial(input):
  32. output=defaultdict(int)
  33. for d in input:
  34. for item in d:
  35. output[item[0]]+=item[1]
  36. return dict(output)
  37.  
  38. def BigYellowCactus(input):
  39. input = sorted(chain(*input), key=lambda x: x[0])
  40. output = {}
  41. for k, g in groupby(input, key=lambda x: x[0]):
  42. output[k] = sum(x[1] for x in g)
  43. return output
  44.  
  45.  
  46. results = [(k.func_name, timeit(lambda: k(input), number=3)) for k in (kos, initial, BigYellowCactus)]
  47. results.sort(key=operator.itemgetter(1))
  48. print '\n'.join(str.format('{:20}{}', *x) for x in results)
  49.  
Success #stdin #stdout 1.24s 11152KB
stdin
Standard input is empty
stdout
initial             0.0154979228973
BigYellowCactus     0.0496730804443
kos                 0.885368108749