XORing long strings opimization?
Georgy Pruss
SEE_AT_THE_END at hotmail.com
Wed Nov 5 01:49:08 EST 2003
Well, nothing to add actually, but my results:
import string
import array
def xorstring0(s1,s2): # the original method
# argument tests were here
# Create lists
l1 = map(ord, s1)
l2 = map(ord, s2)
# Xor it all together
xorlist = []
xorlist = [chr(x ^ y) for (x, y) in zip(l1, l2)]
return string.join(xorlist,"") # Backward compatible
def xorstring1(s1,s2):
xorlist = [chr(ord(x) ^ ord(y)) for (x, y) in zip(s1, s2)]
return string.join(xorlist,"") # Backward compatible
def xorstring2(s1,s2):
xorlist = [chr(ord(s1[i]) ^ ord(s2[i])) for i in range(len(s1))] # range
return string.join(xorlist,"") # Backward compatible
def xorstring3(s1,s2):
xorlist = [chr(ord(s1[i]) ^ ord(s2[i])) for i in xrange(len(s1))] # xrange
return string.join(xorlist,"") # Backward compatible
def xorstring4(s1,s2):
a1 = array.array("B", s1)
a2 = array.array("B", s2)
for i in xrange(len(a1)):
a1[i] ^= a2[i]
return a1.tostring()
s1 = 'abcew'*200000
s2 = 'xyzqa'*200000
fns = [ xorstring0, xorstring1, xorstring2, xorstring3, xorstring4 ]
# check if all works OK for some short data --
# protection from some rough error or typo
sx = fns[0]( s1[:100], s2[:100] )
for fn in fns:
assert sx == fn( s1[:100], s2[:100] )
import time
tms = [60] * len(fns) # assume some unreal big times
for n in range(30): # loop 30 times
for i in range(len(fns)):
tb = time.time()
sx = fns[i]( s1, s2 ) # do it!
tm = time.time() - tb
tms[i] = min( tms[i], tm )
for i in range(len(fns)):
print "fn%d -- %.3f sec -- %.2f" % (i,tms[i],tms[i]/tms[-1])
# fn0 -- 5.578 sec -- 6.37
# fn1 -- 4.593 sec -- 5.25
# fn2 -- 2.609 sec -- 2.98
# fn3 -- 2.531 sec -- 2.89
# fn4 -- 0.875 sec -- 1.00
BTW, for the same million char strings, a C function runs 0.0035 sec, or 250 times faster!
G-:
More information about the Python-list
mailing list