PyWart: The problem with "print"

Chris Angelico rosuav at gmail.com
Sun Jun 2 16:21:06 EDT 2013


On Mon, Jun 3, 2013 at 4:09 AM, Rick Johnson
<rantingrickjohnson at gmail.com> wrote:
> On Jun 2, 12:20 pm, Chris Angelico <ros... at gmail.com> wrote:
>> On Mon, Jun 3, 2013 at 3:04 AM, Rick Johnson
>> >  * Woefully inadequate because: Switching on or off the debug
>> >    messages is only valid in the current module that the
>> >    function was imported. What if you want to kill all
>> >    debugprint messages EVERYWHERE? Do you really want to edit
>> >    "debug = BOOLEAN" in every source file OR do something
>> >    stupid like import debugprint and edit the DEBUG constant
>> >    OR even dumber, edit the debugprint source code? GAWD NO!
>> Easy fix to this one. Instead of copying and pasting debugprint into
>> everything, have it in a module and import it everywhere. Then the
>> debug flag will be common to them all.
>
> Ignoring the fact that you have "import everywhere", what if you want
> to stop ALL debug messages? If you "import everywhere" to get them,
> you then have to "edit everywhere" to stop them.

Example:

## debugprint.py
DEBUG = True
def debugprint(*a,**kw):
  if DEBUG:
    return print(*a,**kw)

## every other module
from debugprint import debugprint
debugprint("I got imported!")
def foo():
  debugprint("I got foo'd!")

See how many places you need to edit to change the DEBUG flag? You can
even do it at run time with this version of the code:

## toggle debugging
import debugprint
debugprint.DEBUG = not debugprint.DEBUG

And, as several others have pointed out, this is kinda sorta what the
logging module does, only it does it better. Same method; you import
the same module everywhere. It is THE SAME module.

>> That's roughly half a second for a million calls to debugprint().
>> That's a 580ns cost per call. Rather than fiddle with the language,
>> I'd rather just take this cost.
>
> I never purposely inject ANY superfluous cycles in my code except in
> the case of testing or development. To me it's about professionalism.

Why do you use Python? Clearly the only professional option is to use
raw assembler. Or possibly you could justify C on the grounds of
portability.

> Let's consider a thought exercise shall we?
>
>   Imagine your an auto mechanic. You customer brings in his
>   car and asks you to make some repairs. You make the
>   repairs but you also adjust the air/fuel ratio to run
>   "rich" (meaning the vehicle will get less MPG). Do you
>   still pat yourself on the back and consider you've done a
>   professional job?
>
> I would not! However, you're doing the same thing as the mechanic when
> your code executes superflouos calls and burns cycles for no other
> reason than pure laziness. CPU's are not immortal you know, they have
> a lifetime. Maybe you don't care about destroying someone's CPU,
> however, i do!

Better analogy: When you build a car, you incorporate a whole bunch of
gauges and indicators. They clutter things up, and they're extra
weight to carry; wouldn't the car get more MPG (side point: can I have
my car get more OGG instead? I like open formats) if you omit them?

> I just wonder how many of your "creations" (aka: monstrosities!) are
> burning cycles this very minute!

Every one that's written in a high level language. So that's Yosemite,
Minstrel Hall, Tisroc, KokoD, RapidSend/RapidRecv, and Vizier. And
that's just the ones that I've personally created and that I *know*
are currently running (and that I can think of off-hand). They're
wasting CPU cycles dealing with stuff that I, the programmer, now
don't have to. Now let's see. According to my server, right now, load
average is 0.21 - of a single-core Intel processor that was mid-range
back in 2009. And that's somewhat higher-than-normal load, caused by
some sort of usage spike a few minutes ago (and is dropping);
normally, load average is below 0.10.

At what point would it be worth my effort to rewrite all that code to
eliminate waste? Considering that I could build a new server for a few
hundred (let's say $1000 to be generous, though the exact price will
depend on where you are), or rent one in a top-quality data center for
$40-$55/month and not have to pay for electricity or internet, any
rewrite would need to take less than two days of my time to be
worthwhile. Let 'em burn cycles; we can always get more.

>> So you can eliminate part of the cost there, if it matters to you. If
>> a half-microsecond cost is going to be significant to you, you
>> probably should be looking at improving other areas, maybe using
>> ctypes/cython, or possibly playing with the new preprocessor tricks
>> that have been being discussed recently. There's really no need to
>> change the language to solve one specific instance of this "problem".
>
> That's like suggesting to the poor fella who's MPG is suffering
> (because of your incompetent adjustments!) to buy fuel additives to
> compensate for the loss of MPG. Why should he incur costs because you
> are incompetent?

He's welcome to push a wheelbarrow if he doesn't want the overhead of
a car. The car offers convenience, but at a cost. This is an eternal
tradeoff.

ChrisA



More information about the Python-list mailing list