Thanks everyone for your responses, it seems like Carl's and Fred's method

with Total-Unitize-Clip is the fastest.

Thanks very much,

Lyle

--

Lyle Gordon

Department of Materials Science and Engineering

Northwestern University

2220 Campus Drive

Evanston, IL 60208

Tel: (847) 491-3584

Mobile: (847) 400-4071

lgo...@u.northwestern.edu

On Mon, Dec 6, 2010 at 5:33 AM, Leonid Shifrin <lsh...@gmail.com> wrote:

> Hi Lyle,

>

> Sorry - I misunderstood the problem. I thought you meant the positional

> arrangement

> of the numbers. Since you seem to be getting plenty of good answers, I

> will not attempt

> to correct myself with more code.

>

>

> Regards,

> Leonid

>

>

> On Mon, Dec 6, 2010 at 5:57 AM, Lyle <lgo...@gmail.com> wrote:

>

>> Dear Listers,

>>

>> I have a large (5-20million) one dimensional list of real numbers and

>> I want to count the number of entries in the list that lie between 2

>> specific values (x1, x2). I need to run the function for a number of

>> different ranges.

>>

>> ie. number of list entries (l), where x1 <= l <= x2

>>

>> I've tried:

>>

>> tallydata[{x1_, x2_}] := Count[data, x_ /; x1 <= x <= x2]

>>

>> that takes about 3-4 seconds

>>

>> and

>>

>> tallydata[{x1_, x2_}] := Length[Select[data, x1 <= # <= x2 &]]

>>

>> which takes a little bit longer.

>>

>> The best I've managed is (this last one might be off by 1 or 2 but

>> this doesn't really matter to me):

>>

>> sorteddata = Sort[data];

>> nf = Nearest[sorteddata];

>> tallyrange[{x1_, x2_}] :=

>> First[Position[sorteddata, First[nf[x2]]]] -

>> First[Position[sorteddata, First[nf[x1]]]]

>>

>> which takes between 1 and 2 seconds but I was hoping there might be a

>> faster way to do this?

>>

>> Any help would be great!

>>

>> Thanks,

>> Lyle Gordon

>>

>> Northwestern University

>>

>>

>