XORing long strings opimization?

Noen not.available at na.no
Tue Nov 4 17:33:52 EST 2003


Noen wrote:

> Tim Peters wrote:
> 
>> [Noen]
>>
>>> ...
>>>     # Xoring
>>>     for c1 in s1:
>>>         for c2 in s2:
>>>             output += chr(ord(c1) ^ ord(c2))
>>>     return output
>>>
>>> This way is very slow for large strings.
>>> Anyone know of a better and faster way to do it?
>>
>>
>>
>> First do an ord() only once per character:
>>
>>     ord1 = map(ord, s1)
>>     ord2 = map(ord, s2)
>>
>> Now loop over that and accumulate the individual results in a list:
>>
>>     alist = [chr(x ^ y) for x in ord1 for y in ord2]
>>
>> Now paste those all together:
>>
>>     return ''.join(alist)
>>
>> The major inefficiency in the original is that "output += ..." copies 
>> all of
>> output each time it's executed (strings in Python are immutable -- you
>> cannot append to a Python string in-place).
>>
>>
>  alist = [chr(x ^ y) for x in ord1 for y in ord2]
> 
> This creates a way too big list... Im not familiar with two for loops in 
> one, so I cant see whats wrong :(
> 
Oh, my debugger says that it works like:
for x in range ord1:
	for y in range ord2:
		chr(x^y)
which does it x*y times...

wonder how the line really should look like...





More information about the Python-list mailing list