[MERGE] rand_chars() optimization

Robert Collins robertc at robertcollins.net
Sun Mar 11 21:16:53 GMT 2007


On Sun, 2007-03-11 at 17:14 +0300, Dmitry Vasiliev wrote:
> John Arbash Meinel wrote:
> > John Arbash Meinel has voted +1 (conditional).
> > Status is now: Semi-approved
> > Comment:
> > Well, if we are going to optimize this one, I have a couple other hints.
> > 
> > First, I like the dictionary.
> > 
> > But appending to a string is expensive, because it has to generate a new 
> > string each time. I'm not sure how this effects rand_chars(16) which is 
> > our common case, but it should be a big deal for rand_chars(50).
> > 
> > And then, if you are using a dictionary, you should make it a local 
> > variable before the loop.
> > 
> > So this is what I would do:
> > 
> > def rand_chars(num):
> >   _map = _rand_chars_map
> >   return ''.join([map[b] for b in rand_bytes(num)])
> > 
> > Using a list comprehension, and then doing using string.join should be 
> > faster.
> > 
> > I tested a list comprehension versus a generator, and 'timeit' says that 
> > the list is faster. I assume this is because the string can iterate once 
> > to figure out how long it needs to be, and then again to merge 
> > everything together. (13us per loop versus 10s) per loop.
> > 
> > So I'm happy with your version, but there are a couple more tricks we 
> > can apply.
> > 
> > Can you benchmark it with the alternative, to see how much it helps?
> 
> Actually I've already tested list/generator comprehension versions and 
> surprisingly version which appending to a string was faster. But I 
> didn't test version with the mapping as a local variable.
> 
> After I've added the local variable test results are:
> 
>   - Generator comprehension: 6577ms/6921ms
>   - List comprehension: 5608ms/5921ms
>   - New version with the loop: 5405ms/5750ms
> 
> I've attached the new version with less memory-aggressive benchmark and 
> the mapping as a local variable.

Cool. Can I ask, did you profile this on python 2.4 and 2.5? One thing
to be wary of in micro optimisations is the possibility of pessimissing
on untested platforms.

-Rob

-- 
GPG key available at: <http://www.robertcollins.net/keys.txt>.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : https://lists.ubuntu.com/archives/bazaar/attachments/20070312/94a09f63/attachment.pgp 


More information about the bazaar mailing list