fork download
  1. import timeit
  2.  
  3. def basic_bitwise_xor(integers):
  4. result = 0
  5. for n in integers:
  6. result ^= n
  7. return result
  8.  
  9. def unrolled_bitwise_xor(integers):
  10. result = 0
  11. count = len(integers)
  12. unrolled_count = count & ~7
  13. leftover = count & 7
  14. i = 0
  15.  
  16. while i < unrolled_count:
  17. result ^= integers[i ]
  18. result ^= integers[i + 1]
  19. result ^= integers[i + 2]
  20. result ^= integers[i + 3]
  21. result ^= integers[i + 4]
  22. result ^= integers[i + 5]
  23. result ^= integers[i + 6]
  24. result ^= integers[i + 7]
  25. i += 8
  26.  
  27. if leftover & 4:
  28. result ^= integers[i ]
  29. result ^= integers[i + 1]
  30. result ^= integers[i + 2]
  31. result ^= integers[i + 3]
  32. i += 4
  33.  
  34. if leftover & 2:
  35. result ^= integers[i ]
  36. result ^= integers[i + 1]
  37. i += 2
  38.  
  39. if leftover & 1:
  40. result ^= integers[i]
  41.  
  42. return result
  43.  
  44. print('basic time:', timeit.timeit('basic_bitwise_xor(l)',
  45. 'l=list(range(100))',
  46. globals=globals(),
  47. number=100000))
  48. print('unrolled time:', timeit.timeit('unrolled_bitwise_xor(l)',
  49. 'l=list(range(100))',
  50. globals=globals(),
  51. number=100000))
Success #stdin #stdout 0.63s 14148KB
stdin
Standard input is empty
stdout
basic time: 0.2191149890422821
unrolled time: 0.3471912555396557