subtle error slows code by 10x (builtin sum()) - replace builtin sumwithout using import?

Discussion in 'Python' started by bdb112, Jul 2, 2011.

  1. bdb112

    bdb112 Guest

    First a trap for new players, then a question to developers

    Code accelerated by numpy can be slowed down by a large factor is you
    neglect to import numpy.sum .

    from timeit import Timer
    frag = 'x=sum(linspace(0,1,1000))'
    Timer(frag ,setup='from numpy import linspace').timeit(1000)
    # 0.6 sec
    Timer(frag, setup='from numpy import sum, linspace').timeit(1000) #
    difference is I import numpy.sum
    # 0.04 sec 15x faster!

    This is obvious of course - but it is very easy to forget to import
    numpy.sum and pay the price in execution.

    Question:
    Can I replace the builtin sum function globally for test purposes so
    that my large set of codes uses the replacement?

    The replacement would simply issue warnings.warn() if it detected an
    ndarray argument, then call the original sum
    I could then find the offending code and use the appropriate import to
    get numpy.sum
    bdb112, Jul 2, 2011
    #1
    1. Advertising

  2. Re: subtle error slows code by 10x (builtin sum()) - replacebuiltin sum without using import?

    On Friday, July 1 at 19:17 (-0700), bdb112 said:

    > Question:
    > Can I replace the builtin sum function globally for test purposes so
    > that my large set of codes uses the replacement?
    >
    > The replacement would simply issue warnings.warn() if it detected an
    > ndarray argument, then call the original sum
    > I could then find the offending code and use the appropriate import to
    > get numpy.sum


    You shouldn't do this, but you could use the __builtins__ module

    e.g.

    >>> __builtins__.sum = numpy.sum # bad
    Albert Hopkins, Jul 2, 2011
    #2
    1. Advertising

  3. bdb112

    Chris Torek Guest

    Re: subtle error slows code by 10x (builtin sum()) - replace builtin sum without using import?

    In article <>
    bdb112 <> wrote:
    >First a trap for new players, then a question to developers
    >
    >Code accelerated by numpy can be slowed down by a large factor is you
    >neglect to import numpy.sum .
    >
    >from timeit import Timer
    >frag = 'x=sum(linspace(0,1,1000))'
    >Timer(frag ,setup='from numpy import linspace').timeit(1000)
    ># 0.6 sec
    >Timer(frag, setup='from numpy import sum, linspace').timeit(1000) #
    >difference is I import numpy.sum
    ># 0.04 sec 15x faster!
    >
    >This is obvious of course - but it is very easy to forget to import
    >numpy.sum and pay the price in execution.
    >
    >Question:
    >Can I replace the builtin sum function globally for test purposes so
    >that my large set of codes uses the replacement?
    >The replacement would simply issue warnings.warn() if it detected an
    >ndarray argument, then call the original sum
    >I could then find the offending code and use the appropriate import to
    >get numpy.sum



    Sure, just execute code along these lines before running any of
    the tests:

    import __builtin__
    import warnings

    _sys_sum = sum # grab it before we change __builtin__.sum

    def hacked_sum(sequence, start=0):
    if isinstance(sequence, whatever):
    warnings.warn('your warning here')
    return _sys_sum(sequence, start)

    __builtin__.sum = hacked_sum

    (You might want to grab a stack trace too, using the traceback
    module.) You said "without using import" but all you have to
    do is arrange for python to import this module before running
    any of your own code, e.g., with $PYTHONHOME and a modified
    site file.
    --
    In-Real-Life: Chris Torek, Wind River Systems
    Intel require I note that my opinions are not those of WRS or Intel
    Salt Lake City, UT, USA (40°39.22'N, 111°50.29'W) +1 801 277 2603
    email: gmail (figure it out) http://web.torek.net/torek/index.html
    Chris Torek, Jul 2, 2011
    #3
    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. Alf P. Steinbach
    Replies:
    2
    Views:
    384
    Alf P. Steinbach
    Jan 25, 2004
  2. Karl Heinz Buchegger
    Replies:
    2
    Views:
    394
    Nils Petter Vaskinn
    Jan 26, 2004
  3. Curt Hibbs
    Replies:
    26
    Views:
    268
    Martin Ankerl
    Mar 22, 2005
  4. gavino
    Replies:
    1
    Views:
    111
    Dr.Ruud
    Jul 19, 2006
  5. MrsEntity
    Replies:
    20
    Views:
    473
Loading...

Share This Page