Looping [was Re: Python and the need for speed]

bartc bc at freeuk.com
Sun Apr 16 08:06:18 EDT 2017


On 16/04/2017 03:51, Steve D'Aprano wrote:
> On Sat, 15 Apr 2017 10:17 pm, bartc wrote:

>> Yes, I'm constantly surprised at this, as such syntax has a very low
>> cost (in my last compiler, supporting 'while' for example only added 30
>> lines to the project).
>
> That's the advantage of writing your own private language and having no
> users except for yourself. You get to cut corners. Python has tens of
> thousands of users, and doesn't have that luxury.

Here are the lines of code in my C compiler which are necessary to 
support 'while': https://pastebin.com/BYFV7EWr

(45 lines shown, but there are exactly 30 Loc if blanks are excluded.)

I'd be interested in knowing why implementing While in Python would need 
significantly more. (The 30 Loc figure is with support for loops /in 
general/ already in place, and is for /adding/ a new loop statement, in 
this case 'while')

> For language developers with responsibilities to users, the job doesn't stop
> at just implementing the feature in the language. It also needs to be
> tested and documented.
>
> As a general rule of thumb, every line of production code should expect to
> add at least ten lines of test code (unit tests, regression tests,
> integration tests, functional tests, doc tests, etc). So for your "30
> lines" feature, that adds 300 lines of tests, and probably another page or
> two of documentation:

No, we're talking about a loop. It must be just about the simplest thing 
to implement in a language (compared with a type system, or code 
generation).

BTW supporting a dedicated endless loop was only about 20 lines in 
another project. Believe me, it is /nothing/. I wish other aspects were 
just as trivial. It didn't even need a dedicated keyword.

 > - describing the various syntax forms;
 > - explaining how they differ;
 > - tutorials for beginners showing each form;

And you don't have to explain how an endless loop should be written as 
'while True', meanwhile advising against using 'while 1'?

> The more choices you offer, the harder that decision becomes:
>
> - numeric Pascal or C-style loop
> - foreach style loop
> - repeat while condition (test at start)
> - repeat until condition (test at start)
> - do ... while condition (test at end)
> - do ... until condition (test at end)
> - repeat forever

So, how many kinds of sequences do you have in Python?

lists
tuples
namedtuples
arrays
bytearrays
string ?
memoryview

plus all those ordered types. My head is already spinning!

The loops I use are categorised as:

* Endless
* N times
* Until some condition is true
* Iterate over an integer sequence
* Iterate over a set of values of some object

Other languages like to have even more elaborate schemes. That includes 
advanced uses of Python's for loop, were, for example, there are 
multiple loop variables.

I wonder how much testing that took to get it right?

> I don't remember the language, but I remember seeing one generalisation of
> the repeat/do loop that puts the test in the middle, rather than at the
> start or end of the loop. If I remember it was something like:
>
> DO
>     setup code  # executed once only
> REPEAT
>     loop body  # before the test
> WHILE condition  # test
>     loop body  # after the test
>
> thus combining both the
>
>     repeat while condition:
>         ...
>
> and
>
>     do:
>         ...
>     until condition
>
>
> styles of looping in one handy syntax.

Perhaps you misremembered as that looks too unwieldy to be practical. If 
implemented orthogonally, then a loop like this:

   While A Do B End

where both A and B can be any sequence of statements or expressions, 
would allow you to write:

   While a; b; c; d Do e; f; g End

with the test (the value of 'd') effectively in the middle.

>> But very common requirements are endless loops, and repeat N times
>> without needing an explicit counter.
>
> If by "very common" you mean "occasionally", I agree.

Most of my loops start off as endless loops, until I can determine the 
actual terminating condition, and where it best goes. Sometimes they 
stay as endless loops.

(Sometimes, I turn a normal statement into an endless loop with a 'do' 
prefix. This is an unusual feature but I use it quite a bit:

    doswitch nextchar()           # looping version of 'switch'
    when 'A'..'Z' then ....
    else exit                     # ie. break out of loop
    end
)

>> Python's byte-code does at least optimise out the check that '1' is
>> true, but that's not what the reader sees, which is 'loop while 1 is
>> true'. And one day it will be:
>>
>>      while l:
>>          body
>>
>> that can be mistaken for that common idiom.
>
> The problem there is not the loop, but the foolish use of lowercase l as a
> variable name.

Maybe. But if 'while 1' wasn't used, then that's one less thing to 
double-check. (I just looked at a random bunch of Python code; there 
were 25 instances of 'while True:', but 40 of 'while 1:'.)

-- 
bartc


More information about the Python-list mailing list