[Python-Dev] performance

Antoine Pitrou solipsis at pitrou.net
Sun Aug 24 21:04:16 CEST 2008


Hi,

> So 3.0 is about 10% slower than 2.x.  Given all the changes, that
> doesn't seem too bad.

Yes, I think it's rather good.

> > - 2.5: 770.54 ms per iteration
> > - 2.6: 572.84 ms per iteration
> > - 3.0: 566.69 ms per iteration
> 
> I'm a little concerned about why the big change here.  Though if I'm
> reading this right it's a speed up...or am I just being optimistic?

Yes, it is a speed up. It is thanks to Armin's method cache.

> >    ComplexPythonFunctionCalls:   173ms   242ms  -28.5%   176ms   243ms  -27.6%
> 
> Maybe explained by Armin's patch.

Actually it is I and Raymond's patch speeding up function calls with named
parameters.

> >                  DictCreation:   115ms   149ms  -22.8%   116ms   150ms  -22.8%
> 
> Why?  What changed?

The opcode sequence for creation of dict literals has been optimized.

> >              StringPredicates:   160ms   185ms  -13.6%   160ms   186ms  -13.9%
> 
> Maybe explained by Armin's patch.

I don't think so.

> >                TryRaiseExcept:   183ms   122ms  +49.6%   184ms   124ms  +48.2%
> 
> Whoa, that's a big slowdown.  I wonder if it's consistent?

Yes, I can definitely reproduce it.

> >             UnicodePredicates:   157ms   175ms  -10.2%   157ms   176ms  -10.6%
> 
> ?

Probably thanks to the speedup in whitespace detection.

> >         CompareFloatsIntegers:    274ms    274ms    0.30us    0.630ms
> 
> Much slower, but probably due to switch from int -> long.  There could
> be potential for optimizing this case.

Well honestly you don't often compare different types. I think the most common
exception to this rule would be None vs. non-None.

> >               CompareIntegers:    277ms    277ms    0.15us    1.272ms
> 
> That's really slow!
> 
> >        CompareInternedStrings:    261ms    261ms    0.17us    3.201ms
> 
> Much slower, but probably str -> unicode conversion.
> 
> >                  CompareLongs:    162ms    162ms    0.15us    0.736ms
> 
> But this is comparable to 2.x.  I don't understand that?

I think CompareIntegers and CompareLongs aren't the same tests exactly, although
they test the same operations.

I've already proposed a patch to speedup comparisons in py3k:
http://bugs.python.org/issue3106

> >                 ConcatStrings:    260ms    273ms    0.55us    1.222ms
> 
> This is much slower in 3.0, even taking into account str -> unicode?

The number of rounds is not the same (60000 for 2.6 with unicode, 100000 for 3.0
with str). It should probably be fixed.

> >                    IfThenElse:    212ms    212ms    0.16us    1.597ms
> 
> Slower?

It is based on integer comparisons though.

> >          NormalClassAttribute:    339ms    340ms    0.28us    1.111ms
> 
> Over twice as slow?

Yes, should be investigated.

> >        SimpleDictManipulation:    280ms    285ms    0.24us    1.059ms
> 
> Slower.  str -> unicode?

No, there are just integers.

> >         SpecialClassAttribute:    534ms    535ms    0.45us    1.121ms
> 
> ~4x slower!

Should be investigated as well.

> >                StringMappings:    471ms    471ms    1.87us    0.884ms
> 
> ~3X slower.

It's normal. This test measures functions like upper(), etc., which are much
expensive using the full unicode database than when doing a straight lookup
in a 256-entry table.

> >                   WithFinally:    185ms    188ms    1.18us    0.881ms
> >               WithRaiseExcept:    274ms    275ms    3.44us    1.105ms
> 
> Slower.

Yes, the new exception semantics have a cost.

Regards

Antoine.




More information about the Python-Dev mailing list