How can I optimise this? [intended in good humour]

John Machin sjmachin at lexicon.net
Mon Jul 24 05:27:18 EDT 2006


Markus wrote:
> You know you're guilty of early/over optimisation, when it's almost two
> in the morning and the file open in front of you reads as follows.
>
>   The code you are about to read is real...
>   Some of the variable names have been changed
>   to protect the families of those involved.
>
> [-snip-]
>
> from timeit import Timer
>
> if __name__=='__main__':
>      t = Timer('len(argv)==1','from sys import argv')
>      print "%f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
>      t = Timer('argv[0]==argv[-1]','from sys import argv')
>      print "%f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
>
> [-snip-]
>
> For anyone is in danger of making the same mistakes I've made...
> the results were:
>
>    0.219154 usec/pass
>    0.297468 usec/pass
>
>
> If anyone doesn't understand...
>   Timer is a "Class for timing execution speed of small code snippets."
>   The quoted description of Timer and the original code I derived the
>   above snippet from, can be found in the Python documentation.
>
> Finally, for anyone who is wondering...
>   I will seek help as soon as I have some free time.
>

Do you realise that the two expressions that you are comparing are not
even equivalent, and moreover you ignored an expression that will be
faster and equivalent (unless/until somebody decides on an
"optimisation" like interning/sharing strings between/among sys.argv
elements).

C:\junk>type showargs.py
from sys import argv
print argv, len(argv)==1, argv[0]==argv[-1], argv[0] is argv[-1]

C:\junk>showargs.py C:\junk\showargs.py
['C:\\junk\\showargs.py', 'C:\\junk\\showargs.py'] False True False

C:\junk>python -mtimeit -s"a=['jabberwocky','jabber'+'wocky']"
"len(a)==1"
1000000 loops, best of 3: 0.142 usec per loop

C:\junk>python -mtimeit -s"a=['jabberwocky','jabber'+'wocky']"
"a[0]==a[-1]"
1000000 loops, best of 3: 0.191 usec per loop

C:\junk>python -mtimeit -s"a=['jabberwocky','jabber'+'wocky']" "a[0] is
a[-1]"
10000000 loops, best of 3: 0.135 usec per loop

C:\junk>python -mtimeit -s"a=['jabberwocky']" "len(a)==1"
1000000 loops, best of 3: 0.132 usec per loop

C:\junk>python -mtimeit -s"a=['jabberwocky']" "a[0]==a[-1]"
1000000 loops, best of 3: 0.14 usec per loop

C:\junk>python -mtimeit -s"a=['jabberwocky']" "a[0] is a[-1]"
1000000 loops, best of 3: 0.111 usec per loop

Cheers,
John




More information about the Python-list mailing list