I get these results (best timing): try-variant: 10.24s regex: 9.58s So on my laptop try:except: function loses about 5% to regex - probably it depends on hardware/OS. Still there is a serious reason why to stick with regexp. try: int(x) is not really checking for an int - it checks for a _number_. So floats will pass that test. And as Massimo pointed out - we don't really check for an int - we check for valid id. Function should be remamed, yes.
Also there is another problem with your testing - you get too much noise this
way. 5-10 ms _per_loop_ is too slow. I get about 9.993 seconds for 40M (!)
operations effectively - 0.25usec per loop - about 10k times faster than
yours. You can check it yourself, my script is attached.
On Tuesday 09 June 2009 23:43:05 AchipA wrote:
> Regardless of speed, if you *really* want to check for integers,
> you'll need a far more complex regex (how do you handle sign ? int
> size ?). int() does all that for you without too much effort.
>
> But, for the record, to satisfy my own curiosity, too - one quickie
> profiling coming up (python 2.5.2, x86_64 linux):
>
> blinky:~# python -m timeit "s=[str(i) for i in range(10000)]"
> 100 loops, best of 3: 4.64 msec per loop
> blinky:~# python -m timeit "s=[str(i) for i in range(10000)]" "def
> is_integer(i):" " try:" " int(i)" " return True" " except:
> return False" "for i in s:" " is_integer(i)"
> 100 loops, best of 3: 9.32 msec per loop
> blinky:~# python -m timeit "s=[str(i) for i in range(10000)]" "import
> re" "integer_pat=re.compile('[0-9]+$')" "is_integer=integer_pat.match"
> "for i in s:" " is_integer(i)"
> 100 loops, best of 3: 10.5 msec per loop
>
> So, technically it's 4.68 vs 5.86msec which is a ~20% speed increase
> over the simplified regex even with the user function overhead. defs
> might be slow, but regexes are no rockets either (C or not).
>
> On Jun 9, 8:05 pm, Iceberg <[email protected]> wrote:
> > I don't know but you'd better do some profiling if you really want to
> > find out. IMHO, try...except might be fast, but wrapping it inside a
> > user-defined function could be another story, because defining a
> > function is expensive in python, so we shall call native function
> > (implemented by C) whenever possible.
> >
> > On Jun10, 0:48am, mdipierro <[email protected]> wrote:
> > > good point. Anyway, the function is no longer called as often as
> > > Alexey originally pointed out, so it would make a negligible
> > > difference. I will change it though.
> > >
> > > Massimo
> > >
> > > On Jun 9, 11:24 am, AchipA <[email protected]> wrote:
> > > > Any particular reason not doing is_integer via a 'try: int(i) except:
> > > > return False' statement ? It should be faster than regexes.
> > > >
> > > > On Jun 7, 1:49 pm, Iceberg <[email protected]> wrote:
> > > > > On Jun7, 6:35pm, Alexey Nezhdanov <[email protected]> wrote:
> > > > > > > 2) is_integer is a fast call, but with 1.1k (!) calls ...
> > > > > >
> > > > > > Replaced it with my own version:
> > > > > > integer_pat=re.compile('[0-9]+$')
> > > > > > is_integer=lambda x: integer_pat.match(x)
> > > > > > it's about 2.3 times faster. C version would be even better.
> > > > >
> > > > > If so, perhaps this is even better:
> > > > >
> > > > > integer_pat=re.compile('[0-9]+$')
> > > > > is_integer=integer_pat.match
> > > > >
> > > > > Because lambda is considered as much slower than built-in
> > > > > functions, AFAIK.
>
>
--
Sincerely yours
Alexey Nezhdanov
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"web2py Web Framework" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---
a.py
Description: application/python
b.py
Description: application/python
sh
Description: application/shellscript

