conditional running of code portion

Discussion in 'Python' started by JW Huang, Aug 5, 2012.

  1. JW Huang

    JW Huang Guest

    Hi,

    How can I implement something like C++'s conditional compile.

    if VERBOSE_MODE: print debug information
    else: do nothing

    But I don't want this condition to be checked during runtime as it
    will slow down the code.

    Thanks in advance.
    JW Huang, Aug 5, 2012
    #1
    1. Advertising

  2. On Sat, 04 Aug 2012 21:16:04 -0700, JW Huang wrote:

    > Hi,
    >
    > How can I implement something like C++'s conditional compile.
    >
    > if VERBOSE_MODE: print debug information else: do nothing
    >
    > But I don't want this condition to be checked during runtime as it will
    > slow down the code.



    You've profiled your code and found that checking a flag is a bottleneck
    in your application? I'd hate to think you were wasting your time trying
    to avoid "slowing down" your code by an insignificant amount that nobody
    will ever notice.

    In general, the way to do C-like conditional compiles is to use C, or at
    least to use another language that isn't Python. Almost everything
    happens at runtime in Python. Possibly PyPy can optimise away unnecessary
    checks, but CPython doesn't.

    One of the very few exceptions: you can disable code at compile time like
    this:

    if __debug__:
    do_something()


    compiles to the byte-code equivalent of:

    do_something()


    under normal circumstances, and to nothing at all if Python is running
    with the -O optimize flag.


    If you are working in a tight loop, you can do this:

    if VERBOSE_FLAG:
    for item in loop:
    print(DEBUG_INFORMATION)
    do_actual_work(item)
    else:
    for item in loop:
    do_actual_work(item)




    --
    Steven
    Steven D'Aprano, Aug 5, 2012
    #2
    1. Advertising

  3. On 05.08.12 09:30, Steven D'Aprano wrote:
    > If you are working in a tight loop, you can do this:
    >
    > if VERBOSE_FLAG:
    > for item in loop:
    > print(DEBUG_INFORMATION)
    > do_actual_work(item)
    > else:
    > for item in loop:
    > do_actual_work(item)


    Or this:

    if VERBOSE_FLAG:
    def do_work(item):
    print(DEBUG_INFORMATION)
    do_actual_work(item)
    else:
    do_work = do_actual_work

    for item in loop:
    do_work(item)
    Serhiy Storchaka, Aug 5, 2012
    #3
  4. On 8/5/2012 12:43 AM, Ramchandra Apte wrote:
    > Try pypreprocessor <http://code.google.com/p/pypreprocessor/> .
    > Better idea:
    > You should be using the logging <http://docs.python.org/library/logging.html>
    > module if you want to print debug information quickly.It uses threads and is
    > optimized to run fast.


    I never saw pypreprocessor. Looks interesting. I have experience with Ned's cog
    preprocessor.

    http://nedbatchelder.com/code/cog/

    I used this in something that was operating at the packet socket level. I had no
    time to test if debug was true.



    --
    Time flies like the wind. Fruit flies like a banana. Stranger things have .0.
    happened but none stranger than this. Does your driver's license say Organ ..0
    Donor?Black holes are where God divided by zero. Listen to me! We are all- 000
    individuals! What if this weren't a hypothetical question?
    steveo at syslang.net
    Steven W. Orr, Aug 6, 2012
    #4
  5. Serhiy Storchaka <> writes:

    > On 05.08.12 09:30, Steven D'Aprano wrote:
    >> If you are working in a tight loop, you can do this:
    >>
    >> if VERBOSE_FLAG:
    >> for item in loop:
    >> print(DEBUG_INFORMATION)
    >> do_actual_work(item)
    >> else:
    >> for item in loop:
    >> do_actual_work(item)

    >
    > Or this:
    >
    > if VERBOSE_FLAG:
    > def do_work(item):
    > print(DEBUG_INFORMATION)
    > do_actual_work(item)
    > else:
    > do_work = do_actual_work
    >
    > for item in loop:
    > do_work(item)


    Be warned: a function call is *much* more expensive than an
    "if variable:".
    Dieter Maurer, Aug 6, 2012
    #5
  6. On 06.08.12 20:02, Dieter Maurer wrote:
    > Serhiy Storchaka <> writes:
    >> On 05.08.12 09:30, Steven D'Aprano wrote:
    >>> If you are working in a tight loop, you can do this:
    >>>
    >>> if VERBOSE_FLAG:
    >>> for item in loop:
    >>> print(DEBUG_INFORMATION)
    >>> do_actual_work(item)
    >>> else:
    >>> for item in loop:
    >>> do_actual_work(item)

    >>
    >> Or this:
    >>
    >> if VERBOSE_FLAG:
    >> def do_work(item):
    >> print(DEBUG_INFORMATION)
    >> do_actual_work(item)
    >> else:
    >> do_work = do_actual_work
    >>
    >> for item in loop:
    >> do_work(item)

    >
    > Be warned: a function call is *much* more expensive than an
    > "if variable:".


    As any actual work. As iteration.

    Yet one way:

    def verbose_iter(it):
    for i in it:
    print(DEBUG_INFORMATION)
    yield i
    ....

    if VERBOSE_FLAG:
    loop = verbose_iter(loop)
    for item in loop:
    do_work(item)
    Serhiy Storchaka, Aug 6, 2012
    #6
    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. Tharma
    Replies:
    5
    Views:
    509
    Skeleton Man
    May 21, 2004
  2. Serge Poirier

    removing the time portion of date field

    Serge Poirier, Nov 8, 2003, in forum: ASP .Net
    Replies:
    1
    Views:
    472
    Lyndon Hills
    Nov 8, 2003
  3. VB Programmer

    Border for only portion of a cell?

    VB Programmer, Jun 10, 2004, in forum: ASP .Net
    Replies:
    2
    Views:
    320
    VB Programmer
    Jun 10, 2004
  4. Alec S.
    Replies:
    10
    Views:
    10,120
    Alec S.
    Apr 16, 2005
  5. Charles Wilson
    Replies:
    25
    Views:
    2,335
Loading...

Share This Page