Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^3: Can you write a faster code to perform this task?

by trizen (Hermit)
on Sep 29, 2014 at 11:50 UTC ( [id://1102341]=note: print w/replies, xml ) Need Help??


in reply to Re^2: Can you write a faster code to perform this task?
in thread Can you write a faster code to perform this task?

What about something like this?
use 5.014; say 'iiiiiiiiMMMMMMMMMMMooooooooooooMMMMMMMMMMiiiiiMMMMMMMMoooo' =~ tr/M/~/sr=~tr/~//; # => prints: 3
Update: just to be sure, it would be safer to replace 'M' with something much exotic, like '\0', which should be OK, assuming that you're reading text files. (tr/M/\0/sr =~ tr/\0//)

Replies are listed 'Best First'.
Re^4: Can you write a faster code to perform this task?
by Lotus1 (Vicar) on Sep 29, 2014 at 18:30 UTC

    I tried it with replacing 'M' with 'M' and it worked. No need to worry about exotic characters.

    use 5.014; say 'iiiiiiiiMMMMMMMMMMMooooooooooooMMMMMMMMMMiiiiiMMMMMMMMoooo' =~ tr/M/M/sr=~tr/M//; # => prints: 3

      No need for a new perl and the /r option either. This works fine:

      #! perl -slw use strict; use Time::HiRes qw[ time ]; my $start = time; my $count=0; while( <DATA> ) { # $count += ()= m{M+}g; tr/M/M/s; $count += tr/M/M/; } print $count."\n"; printf "Took %9f secs\n", time() - $start;

      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
Re^4: Can you write a faster code to perform this task?
by LanX (Saint) on Sep 29, 2014 at 12:07 UTC
    Well TIMTOWTDI with two chained tr is not necessarily fast. :)

    But who knows, try to benchmark... :)

    Cheers Rolf

    (addicted to the Perl Programming Language and ☆☆☆☆ :)

      tr is MUCH faster than s though. I tried to work this out but didn’t hit on trizen’s cleverness. So…

      # (v5.18.2) built for darwin-2level 'tr' => sub { $str =~ tr/M/~/sr=~tr/~//; }, -- count 3 regex 3 regex2 3 split 3 tr 3 Rate regex2 split regex count tr regex2 169354/s -- -62% -65% -75% -94% split 446500/s 164% -- -7% -34% -85% regex 481882/s 185% 8% -- -29% -84% count 674634/s 298% 51% 40% -- -78% tr 3044813/s 1698% 582% 532% 351% --

      Update: as trizen noted in his code, the /r flag to tr came in at 5.14. It won’t work on older Perls (update: <- stupid apostrophe begone).

        > I tried to work this out but didn’t hit on trizen’s cleverness.

        me too / neither =)

        (tried /s but the returned count wasn't for groups)

        > the /r flag to tr came in at 5.14. It won’t work on older Perls

        If it's that fast using $str twice shouldn't be a big problem.

        Should be mentioned that tr is destructive, i.e. a safety copy of the string may be needed too.

        Cheers Rolf

        (addicted to the Perl Programming Language and ☆☆☆☆ :)

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1102341]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (3)
As of 2024-04-25 19:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found