On Wed, Apr 15, 2009 at 10:05 PM, Stefan Behnel <[email protected]> wrote: > Hi, > > now, those are interesting timings. Which versions of Cython and Python did > you use?
hi, i am using python 2.5 with cython .10 and .11 -- which both give same ballpark. thanks for the explanation. -brent > > Brent Pedersen wrote: >> here are the new timings: >> >> PY_NEW on Cython class: 1.137 >> __init__ on Cython class 1.154 > > You're right, that's almost negligible. However, the __init__ benchmark > involves the overhead of a Python call to create_interval, which uses the > same Python calling convention as the constructor. So it's more or less > doing the same thing in both cases, just additionally calling __init__ > through a C struct member dereference in the second case (but without > repacking the arguments). > > Also note that it can actually be a feature that PY_NEW doesn't call > __init__(). I happily misuse that in lxml.etree to assign different > behaviour to a user class instantiation and an internal proxy creation. > > >> batch PY_NEW total: 0.821 , interval only: 0.363 >> batch __init__ on Cython class total 0.975 , interval_only: 0.524 > > As expected, the difference is a lot larger here. Ignoring the setup > overhead, that's some 30% faster, as PY_NEW does the field initialisation > inside a plain C call, whereas the call to __init__ requires the Python > calling convention (i.e. tuple packing and unpacking). > > >> __init__ on Python class: 28.468 >> __init__ on Python class with slots: 9.936 > > Ok, that's a completely different performance league. The first benchmark > requires setting up a dictionary for the instance and putting the > attributes there, whereas the second happily assigns the attributes to > predefined slots, without the overhead of a dict. > > To sum it up, using PY_NEW from the beginning looks like a premature > optimisation to me. If you notice that class creation becomes a bottleneck > later on, *and* your classes are instantiated internally in the relevant > cases, *and* the setup involves working with plain C field values (such as > the 'start' and 'end' ints in your case), switching to PY_NEW can give you > about 30% in plain class instantiation time (YMWV, don't forget to > benchmark your own code). > > Thanks for sharing, > > Stefan > _______________________________________________ > Cython-dev mailing list > [email protected] > http://codespeak.net/mailman/listinfo/cython-dev > _______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
