Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re: Sorting keys of hash table by values

by kyle (Abbot)
on Jan 31, 2008 at 21:38 UTC ( #665454=note: print w/ replies, xml ) Need Help??


in reply to Sorting keys of hash table by values

Just reverse sort:

@sortedKeys = reverse sort { $h{$a} <=> $h{$b} } keys %h;


Comment on Re: Sorting keys of hash table by values
Download Code
Re^2: Sorting keys of hash table by values
by rjray (Chaplain) on Jan 31, 2008 at 22:28 UTC

    Bad. reverse means extra operations and making a second list that is the same size as the original.

    The first reply is the best, as it does not involve any extra operations.

    --rjray

      Did you try it?
      I thought that too but testing samtregar and kyles versions took the same time. Ikegamis version is about 6% slower.

        How did you test it? What size(s) of hash tables? How many iterations? Particularly if the hash table is small, the differences could be swallowed up by variations in the O/S CPU scheduling and other tasks running at the same time.

        --rjray

      I thought you might say that (and by "you", I mean "somebody").

      use Benchmark qw( cmpthese ); use List::Util qw( shuffle ); my @set = shuffle 1 .. 1_000_000; cmpthese( 100, { 'sort' => sub { my @x = sort { $b <=> $a } @set; return; } +, 'rsort' => sub { my @x = reverse sort { $a <=> $b } @set; +return; }, } ); __END__ Rate sort rsort sort 1.01/s -- -2% rsort 1.03/s 2% --

      (As I recall, 2% is within the margin of error for Benchmark.)

      In perl (the implementation of Perl), there's a special case for reverse sort so that it doesn't have the performance penalty you might otherwise expect it to have. That being the case, the main difference between reverse sort { $a cmp $b } and sort { $b cmp $a } is how they read to the programmer. I think that it's far more obvious what's going on when you reverse sort especially as the expressions involved become more complicated. It could be pretty easy to lose the $a and $b in a big block. Even if it were not optimized, I think you'd have to have a pretty long list before the performance penalty outweighs the maintainability benefit.

      This also means there's no performance penalty for reverse sort { $b <=> $a }, but that's just rude.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (9)
As of 2014-10-21 08:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (98 votes), past polls