Re: Fast way to select those elements from a list that are in another
- To: mathgroup at smc.vnet.net
- Subject: [mg87071] Re: Fast way to select those elements from a list that are in another
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Mon, 31 Mar 2008 02:02:43 -0500 (EST)
- Organization: The Open University, Milton Keynes, UK
- References: <frt574$sj8$1@smc.vnet.net>
Andrew Moylan wrote: > Two lists of integers: > > {a, b} = Table[RandomInteger[10000, 1000], {2}]; > > Which elements from a are in b? > > Select[a, MemberQ[b, #] &]; // Timing >>> {0.351, Null} > > It takes about 0.351 seconds (on my slow laptop). Specialised > functions for related tasks, such as Intersection[a, b], are much > faster: > > Intersection[a, b]; // Timing >>> {0., Null} > > Using Intersection, here's a somewhat faster way to select those > elements from a that are in b: > > With[ > {c = Intersection[a, b]}, > Select[a, MemberQ[c, #] &] > ]; // Timing >>> {0.09, Null} > > Is there a better, faster way to do this? Andrew, I have came up with the following, which is, I believe, the fastest among all solutions that have been posted (as of today): Pick[a, Thread[a == b]] For instance, {a, b} = Table[RandomInteger[10000, 1000], {2}]; s1 = Select[a, MemberQ[b, #] &]; // Timing // First s2 = With[{c = Intersection[a, b]}, Select[a, MemberQ[c, #] &]]; // Timing // First s3 = Pick[a, Thread[a == b]]; // Timing // First s1 === s2 === s3 (* 0.127442 0.01327 0.000111 True *) Regards, -- Jean-Marc