Optimizing Small Python Code

Avi Gross avigross at verizon.net
Thu Jun 24 11:58:20 EDT 2021


Jan,

As an academic discussion, yes, many enhancements only pay off when things are larger. 

And for most purposes, I/O is so much slower that it makes little difference. But on a multi-processing machine, extra CPU may impact how much else the machine can do at the same time.

Here is an example of what I meant. Given exactly the current output, what is the shorter program you can use to cheat and produce an answer.

Recall the original output has a length of 169:

a = """1
      0
2
      0
      1
3
      0
      1
 2
4
0
      1
      2
      3
5
      0
      1
      2
      3
4
6
      0
      1
      2
      3
      4
      5
      """

len(a)


Now if you had already used a compression algorithm on it, you would get this:

import zlib
a = zlib.compress(a.encode("ascii"))
len(a)

Now a has a length of 53!

It now looks like this:

b'x\x9c3\xe4R\x00\x03\x03.#8\x0bB\x1br\x19c\x88(\x18q\x99p!q\xc1\x00\xa6\xd1\x98\xcb\x14S\x03\x9a\n\x13.3\x82j \xb4\t\x94\x86\x99\t\x00\xdc\x87\x14\xb7'

So the shorter cheat program might now be:

>>> print(zlib.decompress(b'x\x9c3\xe4R\x00\x03\x03.#8\x0bB\x1br\x19c\x88(\x18q\x99p!q\xc1\x00\xa6\xd1\x98\xcb\x14S\x03\x9a\n\x13.3\x82j \xb4\t\x94\x86\x99\t\x00\xdc\x87\x14\xb7').decode("ASCII"))
1
      0
2
      0
      1
3
      0
      1
 2
4
0
      1
      2
      3
5
      0
      1
      2
      3
4
6
      0
      1
      2
      3
      4
      5
      
Of course, the above has overhead as you have a line to import the library as well as the darn function names but for larger amounts of text, those stay fixed.

I note again this won't fool humans but some on-line courses that just take your program and run it and only compare the output will be fooled.


-----Original Message-----
From: jan <rtm443x at googlemail.com> 
Sent: Thursday, June 24, 2021 3:01 AM
To: Avi Gross <avigross at verizon.net>
Cc: python-list at python.org
Subject: Re: Optimizing Small Python Code

If I'm not mistaken, the original output is O(n^2) in quantity of chars, and as output time is proportional to the length of the output, that makes the output time also O(n^2) here too.

So I guess this only looks like it's reduced to linear because the output here is very small. For large n it would become obvious.

jan

On 24/06/2021, Avi Gross via Python-list <python-list at python.org> wrote:
> Yes, I agree that if you do not need to show your work to a human, 
> then the problem specified could be solved beforeand and a simple 
> print statement would suffice.
>
> Ideally you want to make a problem harder such as by specifying an N 
> that varies then testing it with an arbitrary N.
>
> But I suggest the item below is not minimal. You can store the 
> printout more compactly as the only symbols out put are tabs, newlines 
> and seven digits.
> If your language supported some function that expanded a binary string 
> that used say 4 bytes per symbol so it could be printed, or accepted a 
> compressed form of the string and uncompressed it, you might have code 
> like:
>
> print(unzip("n*n&&S!~se"))
>
> -----Original Message-----
> From: Python-list 
> <python-list-bounces+avigross=verizon.net at python.org> On Behalf Of 
> Michael F. Stemper
> Sent: Wednesday, June 23, 2021 10:23 AM
> To: python-list at python.org
> Subject: Re: Optimizing Small Python Code
>
> On 23/06/2021 08.17, Stefan Ram wrote:
>> "Avi Gross" <avigross at verizon.net> writes:
>>> This can be made a one-liner too! LOL!
>>
>> print( '1\n      0\n2\n      0\n      1\n3\n      0\n      1\n
>> 2\n4\n
> 0\n      1\n      2\n      3\n5\n      0\n      1\n      2\n      3\n
> 4\n6\n      0\n      1\n      2\n      3\n      4\n      5\n' )
>
> Unless I'm figuring ot wrong, you just took it from O(n^2) to O(1). 
> That deserves a Turing award or something.
>
> --
> Michael F. Stemper
> You can lead a horse to water, but you can't make him talk like Mr. Ed 
> by rubbing peanut butter on his gums.
> --
> https://mail.python.org/mailman/listinfo/python-list
>
> --
> https://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list