Looping [was Re: Python and the need for speed]
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
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?
plus all those ordered types. My head is already spinning!
The loops I use are categorised as:
* 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:
> setup code # executed once only
> loop body # before the test
> WHILE condition # test
> loop body # after the test
> thus combining both the
> repeat while condition:
> 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
>> 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:
>> 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:'.)
More information about the Python-list