python 3 problem: how to convert an extension method into a classMethod

Discussion in 'Python' started by Robin Becker, Feb 26, 2013.

  1. Robin Becker

    Robin Becker Guest

    In python 2 I was able to improve speed of reportlab using a C extension to
    optimize some heavily used methods.

    so I was able to do this


    class A:
    .....
    def method(self,...):
    ....


    try:
    from extension import c_method
    import new
    A.method = new.instancemethod(c_method,None,A)
    except:
    pass

    and if the try succeeds our method is bound as a class method ie is unbound and
    works fine when I call it.

    In python 3 this doesn't seem to work at all. In fact the new module is gone.
    The types.MethodType stuff doesn't seem to work.

    Is there a way in Python 3.3 to make this happen? This particular method is
    short, but is called many times so adding python wrapping layers is not a good
    way forward.

    If the above cannot be made to work (another great victory for Python 3) then is
    there a way to bind an external method to the instance without incurring too
    much overhead.

    Alternatively could it make sense to implement an accelerated basetype that just
    contains the accelerated methods of class A. I could then imagine doing
    something like

    try:
    from extension import class c_baseA as baseA
    except:
    class baseA:
    def method(....)

    class A(baseA):
    .....

    presumably I then get some kind of penalty for the base class lookup, but how
    bad is that?
    --
    Robin Becker
     
    Robin Becker, Feb 26, 2013
    #1
    1. Advertising

  2. Re: python 3 problem: how to convert an extension method into aclassMethod

    On Tue, 26 Feb 2013 17:21:16 +0000, Robin Becker wrote:

    > In python 2 I was able to improve speed of reportlab using a C extension
    > to optimize some heavily used methods.
    >
    > so I was able to do this
    >
    >
    > class A:
    > .....
    > def method(self,...):
    > ....
    >
    >
    > try:
    > from extension import c_method
    > import new
    > A.method = new.instancemethod(c_method,None,A)
    > except:
    > pass


    Why are you suppressing and ignoring arbitrary errors here? That doesn't
    sound good. Surely a better way would be:

    import new
    try:
    from extension import c_method
    except ImportError:
    pass
    else:
    A.method = new.instancemethod(c_method, None, A)



    > and if the try succeeds our method is bound as a class method ie is
    > unbound and works fine when I call it.
    >
    > In python 3 this doesn't seem to work at all. In fact the new module is
    > gone. The types.MethodType stuff doesn't seem to work.


    I've never tried this with a function written in C, but for one written
    in Python all you need is this:

    A.method = c_method


    Try that and see if it works with your function written in C. I expect
    that it will, provided that the function is written as a method
    descriptor. I don't know enough about C extensions to tell you how to do
    that, sorry.



    --
    Steven
     
    Steven D'Aprano, Feb 27, 2013
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Dave Angel
    Replies:
    0
    Views:
    134
    Dave Angel
    Feb 26, 2013
  2. Peter Otten
    Replies:
    0
    Views:
    132
    Peter Otten
    Feb 26, 2013
  3. Mark Lawrence
    Replies:
    0
    Views:
    137
    Mark Lawrence
    Feb 26, 2013
  4. Peter Otten
    Replies:
    0
    Views:
    140
    Peter Otten
    Feb 26, 2013
  5. Ethan Furman
    Replies:
    0
    Views:
    161
    Ethan Furman
    Feb 26, 2013
Loading...

Share This Page