The Cost of Dynamism (was Re: Pyhon 2.x or 3.x, which is faster?)

BartC bc at freeuk.com
Sun Mar 13 15:39:29 EDT 2016


On 13/03/2016 01:10, Mark Lawrence wrote:
> On 12/03/2016 23:57, BartC wrote:

[switch statements]
>> How does Python manage without them? Is it really necessary to declare
>> hundreds of individual variables and assign a value to each? (And risk
>> someone assigning a new value to them.)
>>
>> That they might lead to more efficient code is secondary, but definitely
>> a bonus (essential though when used in a switch statement).
>>
>
> It is 2016.  Programmer time, and hence money, are far more important
> than runtime speed in the vast majority of cases.

Exactly why having ready-made solutions is preferable to everyone 
hacking their own solutions to switch.

> There are plenty of
> working recipes for switch in Python.  I'll leave you to quote a few as
> you are such an expert in the Python programming language.

I've seen a few. Here's one that uses:

class switch(object):
     value = None
     def __new__(class_, value):
         class_.value = value
         return True

def case(*args):
     return any((arg == switch.value for arg in args))

I used it in my benchmark to replace the if-else chain checking three 
lots of ranges:

switch(c)
if case(ord("A"),ord("B"),ord("C"),ord("D"),ord("E"),ord("F"),
         ord("G"),ord("H"),ord("I"),ord("J"),ord("K"),ord("L"),
         ord("M"),ord("N"),ord("O"),ord("P"),ord("Q"),ord("R"),
         ord("S"),ord("T"),ord("U"),ord("V"),ord("W"),ord("X"),
         ord("Y"),ord("Z")):
     upper+=1
elif case(ord("a"),ord("b"),ord("c"),ord("d"),ord("e"),ord("f"),
         ord("g"),ord("h"),ord("i"),ord("j"),ord("k"),ord("l"),
         ord("m"),ord("n"),ord("o"),ord("p"),ord("q"),ord("r"),
         ord("s"),ord("t"),ord("u"),ord("v"),ord("w"),ord("x"),
         ord("y"),ord("z")):
     lower+=1
elif case(ord("0"),ord("1"),ord("2"),ord("3"),ord("4"),ord("5"),
           ord("6"),ord("7"),ord("8"),ord("9")):
     digits+=1
else:
     other+=1

It worked, but took 110 seconds; 80 seconds without the ord's and 
comparing strings (but I still think it's perverse that integer ops are 
slower than string ops).

But 110 or 80 seconds, the original Python was 3.6 seconds. (Probably, 
someone could tweak it to work with ranges, but this is extra programmer 
effort that you say is too valuable to waste on such matters.)

(An actual 62-way if-elif chain took 25 seconds in Python 3.

You might care not about speed, but it's something when the fastest 
solution in a language with built-in switch, and /still interpreting a 
byte-code at a time/, is 1000 times faster than the 80-second version 
above.)


-- 
Bartc



More information about the Python-list mailing list