Re: How can I optimise this? [intended in good humour]
John Machin wrote: > 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" % (100 * t.timeit(number=10)/10) >> t = Timer('argv[0]==argv[-1]','from sys import argv') >> print "%f usec/pass" % (100 * t.timeit(number=10)/10) > 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). Let me point out that len(argv) == 1 is the only one that will work if argv is []. ;) (took me a few seconds to realize I must put a smiley there) Georg -- http://mail.python.org/mailman/listinfo/python-list
Re: How can I optimise this? [intended in good humour]
"John Machin" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > 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. > > > > > > from timeit import Timer > > > > if __name__=='__main__': > > t = Timer('len(argv)==1','from sys import argv') > > print "%f usec/pass" % (100 * t.timeit(number=10)/10) > > t = Timer('argv[0]==argv[-1]','from sys import argv') > > print "%f usec/pass" % (100 * t.timeit(number=10)/10) > > > > [-snip-] You're worried about the performance of len(sys.argv)?! Is your command line processing *really* your program bottleneck? If so, I'd say making a better len is the least of your problems. Hard to imagine you'll do better than len, especially for lists as short as command line args. If you are *really* doing lots of len'ning, copy len to a local to cut down on lookup costs: C:\Documents and Settings\Paul>python -mtimeit -s"a=['abc','abc']" "len(a)" 100 loops, best of 3: 0.218 usec per loop C:\Documents and Settings\Paul>python -mtimeit -s"a=['abc','abc'];len_=len" "len_(a)" 1000 loops, best of 3: 0.172 usec per loop But honestly, do some profiling before adding these maintenance-hindering and readability-impairing "optimizations." -- Paul -- http://mail.python.org/mailman/listinfo/python-list
Re: How can I optimise this? [intended in good humour]
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" % (100 * t.timeit(number=10)/10) > t = Timer('argv[0]==argv[-1]','from sys import argv') > print "%f usec/pass" % (100 * t.timeit(number=10)/10) > > [-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" 100 loops, best of 3: 0.142 usec per loop C:\junk>python -mtimeit -s"a=['jabberwocky','jabber'+'wocky']" "a[0]==a[-1]" 100 loops, best of 3: 0.191 usec per loop C:\junk>python -mtimeit -s"a=['jabberwocky','jabber'+'wocky']" "a[0] is a[-1]" 1000 loops, best of 3: 0.135 usec per loop C:\junk>python -mtimeit -s"a=['jabberwocky']" "len(a)==1" 100 loops, best of 3: 0.132 usec per loop C:\junk>python -mtimeit -s"a=['jabberwocky']" "a[0]==a[-1]" 100 loops, best of 3: 0.14 usec per loop C:\junk>python -mtimeit -s"a=['jabberwocky']" "a[0] is a[-1]" 100 loops, best of 3: 0.111 usec per loop Cheers, John -- http://mail.python.org/mailman/listinfo/python-list
How can I optimise this? [intended in good humour]
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" % (100 * t.timeit(number=10)/10) t = Timer('argv[0]==argv[-1]','from sys import argv') print "%f usec/pass" % (100 * t.timeit(number=10)/10) [-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. ;) Markus -- http://mail.python.org/mailman/listinfo/python-list