import timeit
def basic_bitwise_xor(integers):
result = 0
for n in integers:
result ^= n
return result
def unrolled_bitwise_xor(integers):
result = 0
count = len(integers)
unrolled_count = count & ~7
leftover = count & 7
i = 0
while i < unrolled_count:
result ^= integers[i ]
result ^= integers[i + 1]
result ^= integers[i + 2]
result ^= integers[i + 3]
result ^= integers[i + 4]
result ^= integers[i + 5]
result ^= integers[i + 6]
result ^= integers[i + 7]
i += 8
if leftover & 4:
result ^= integers[i ]
result ^= integers[i + 1]
result ^= integers[i + 2]
result ^= integers[i + 3]
i += 4
if leftover & 2:
result ^= integers[i ]
result ^= integers[i + 1]
i += 2
if leftover & 1:
result ^= integers[i]
return result
print('basic time:', timeit.timeit('basic_bitwise_xor(l)',
'l=list(range(100))',
globals=globals(),
number=100000))
print('unrolled time:', timeit.timeit('unrolled_bitwise_xor(l)',
'l=list(range(100))',
globals=globals(),
number=100000))
aW1wb3J0IHRpbWVpdAoKZGVmIGJhc2ljX2JpdHdpc2VfeG9yKGludGVnZXJzKToKICAgIHJlc3VsdCA9IDAKICAgIGZvciBuIGluIGludGVnZXJzOgogICAgICAgIHJlc3VsdCBePSBuCiAgICByZXR1cm4gcmVzdWx0CgpkZWYgdW5yb2xsZWRfYml0d2lzZV94b3IoaW50ZWdlcnMpOgogICAgcmVzdWx0ID0gMAogICAgY291bnQgPSBsZW4oaW50ZWdlcnMpCiAgICB1bnJvbGxlZF9jb3VudCA9IGNvdW50ICYgfjcKICAgIGxlZnRvdmVyID0gY291bnQgJiA3CiAgICBpID0gMAoKICAgIHdoaWxlIGkgPCB1bnJvbGxlZF9jb3VudDoKICAgICAgICByZXN1bHQgXj0gaW50ZWdlcnNbaSAgICBdCiAgICAgICAgcmVzdWx0IF49IGludGVnZXJzW2kgKyAxXQogICAgICAgIHJlc3VsdCBePSBpbnRlZ2Vyc1tpICsgMl0KICAgICAgICByZXN1bHQgXj0gaW50ZWdlcnNbaSArIDNdCiAgICAgICAgcmVzdWx0IF49IGludGVnZXJzW2kgKyA0XQogICAgICAgIHJlc3VsdCBePSBpbnRlZ2Vyc1tpICsgNV0KICAgICAgICByZXN1bHQgXj0gaW50ZWdlcnNbaSArIDZdCiAgICAgICAgcmVzdWx0IF49IGludGVnZXJzW2kgKyA3XQogICAgICAgIGkgKz0gOAoKICAgIGlmIGxlZnRvdmVyICYgNDoKICAgICAgICByZXN1bHQgXj0gaW50ZWdlcnNbaSAgICBdCiAgICAgICAgcmVzdWx0IF49IGludGVnZXJzW2kgKyAxXQogICAgICAgIHJlc3VsdCBePSBpbnRlZ2Vyc1tpICsgMl0KICAgICAgICByZXN1bHQgXj0gaW50ZWdlcnNbaSArIDNdCiAgICAgICAgaSArPSA0CgogICAgaWYgbGVmdG92ZXIgJiAyOgogICAgICAgIHJlc3VsdCBePSBpbnRlZ2Vyc1tpICAgIF0KICAgICAgICByZXN1bHQgXj0gaW50ZWdlcnNbaSArIDFdCiAgICAgICAgaSArPSAyCgogICAgaWYgbGVmdG92ZXIgJiAxOgogICAgICAgIHJlc3VsdCBePSBpbnRlZ2Vyc1tpXQoKICAgIHJldHVybiByZXN1bHQKCnByaW50KCdiYXNpYyB0aW1lOicsIHRpbWVpdC50aW1laXQoJ2Jhc2ljX2JpdHdpc2VfeG9yKGwpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbD1saXN0KHJhbmdlKDEwMCkpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzPWdsb2JhbHMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXI9MTAwMDAwKSkKcHJpbnQoJ3Vucm9sbGVkIHRpbWU6JywgdGltZWl0LnRpbWVpdCgndW5yb2xsZWRfYml0d2lzZV94b3IobCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsPWxpc3QocmFuZ2UoMTAwKSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHM9Z2xvYmFscygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcj0xMDAwMDApKQ==