Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: Fastest way to "pick without replacement"

by Eily (Monsignor)
on Nov 20, 2020 at 15:37 UTC ( #11123905=note: print w/replies, xml ) Need Help??


in reply to Fastest way to "pick without replacement"

If you don't care about order, replacing the deleted element by the last in the array works as well. And I was expecting it to be faster than splice (since I was expecting the latter to move every element after the one that is removed) but the performances are actually very similar:

use warnings; use strict; use Benchmark qw/cmpthese/; my $size = 1e3; my @numbers = ( 0..$size ); my $index = 3; my @expect = ( 0..2,4..$size ); use constant TEST => 0; cmpthese(-2, { splice => sub { my @output = @numbers; splice @output, $index, 1; join("\0", sort @output) eq join("\0", sort @expect) or die if TES +T; }, grep => sub { # https://www.perlmonks.org/?node_id=11123877 my @output = @numbers[ grep $_ != $index, 0 .. $#numbers ]; join("\0", sort @output) eq join("\0", sort @expect) or die if TES +T; }, swap => sub { my @output = @numbers; $output[$index] = pop @output; join("\0", sort @output) eq join("\0", sort @expect) or die if TES +T; }, });
C:\Projets\perl>perl pm_select_11123879.pm Rate grep swap splice grep 14287/s -- -73% -73% swap 52519/s 268% -- -0% splice 52549/s 268% 0% --

NB: I checked, it works fine when $index is the last element in the array as well.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (3)
As of 2021-09-28 05:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?