> From: Roger Hui <[EMAIL PROTECTED]> > Date: Thursday, May 24, 2007 6:17 pm > Subject: [Jprogramming] index in nub > > (~.y)i.y finds the indices of y in the nub of y . > Can you do it faster?
Spoiler below. timer=: 6!:2 y=: 1e6 [EMAIL PROTECTED] 2e9 timer '(~.y)i.y' 1.08679 timer '(~.i.]) i.~ y' 0.437234 y=: 1e6 [EMAIL PROTECTED] 0 timer '(~.y)i.y' 2.62438 timer '(~.i.]) i.~ y' 1.29647 y=: ":&.> 1e6 [EMAIL PROTECTED] 1e5 timer '(~.y)i.y' 3.00702 timer '(~.i.]) i.~ y' 1.54582 NB. counterexample, not faster y=: 1e6 [EMAIL PROTECTED] 100 timer '(~.y)i.y' 0.0264034 timer '(~.i.]) i.~ y' 0.0321949 Explanation: The dyad x i. y is not equally fast on all arguments. Listed from faster to slower: - boolean and literal - small range integers, where small range means about the size of #x - general integers - floating point numbers etc. When y is not one of the fast ones, (~.y)i.y requires two slow operations, one for ~.y and another for the i. in (~.y)i.y , because ~.y and y have the same classification. In contrast, (~.i.])i.~y (same as (~.t)i.t=.i.~y) has one slow operation to do i.~y , producing a list of small-range integers, whence (~.i.]) is a fast operation. By the way, i.~y , even when "slow", is supported by special code, as the following benchmark demonstrates: timer 'i.~ y' 0.357208 timer 'y i. y' 0.355987 timer 'y i. y0' 0.624246 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
