Re: [Numpy-discussion] argsort speed

2014-02-24 Thread Ondřej Čertík
On Fri, Feb 21, 2014 at 11:09 PM, Charles R Harris
charlesr.har...@gmail.com wrote:



 On Fri, Feb 21, 2014 at 10:35 PM, Ondřej Čertík ondrej.cer...@gmail.com
 wrote:

 On Mon, Feb 17, 2014 at 11:40 AM, Charles R Harris
 charlesr.har...@gmail.com wrote:
 
 
 
  On Mon, Feb 17, 2014 at 11:32 AM, Julian Taylor
  jtaylor.deb...@googlemail.com wrote:
 
  On 17.02.2014 15:18, Francesc Alted wrote:
   On 2/17/14, 1:08 AM, josef.p...@gmail.com wrote:
   On Sun, Feb 16, 2014 at 6:12 PM, Daπid davidmen...@gmail.com
   wrote:
   On 16 February 2014 23:43, josef.p...@gmail.com wrote:
   What's the fastest argsort for a 1d array with around 28 Million
   elements, roughly uniformly distributed, random order?
  
   On numpy latest version:
  
   for kind in ['quicksort', 'mergesort', 'heapsort']:
print kind
%timeit np.sort(data, kind=kind)
%timeit np.argsort(data, kind=kind)
  
  
   quicksort
   1 loops, best of 3: 3.55 s per loop
   1 loops, best of 3: 10.3 s per loop
   mergesort
   1 loops, best of 3: 4.84 s per loop
   1 loops, best of 3: 9.49 s per loop
   heapsort
   1 loops, best of 3: 12.1 s per loop
   1 loops, best of 3: 39.3 s per loop
  
  
   It looks quicksort is quicker sorting, but mergesort is marginally
   faster
   sorting args. The diference is slim, but upon repetition, it
   remains
   significant.
  
   Why is that? Probably part of the reason is what Eelco said, and
   part
   is
   that in sort comparison are done accessing the array elements
   directly, but
   in argsort you have to index the array, introducing some overhead.
   Thanks, both.
  
   I also gain a second with mergesort.
  
   matlab would be nicer in my case, it returns both.
   I still need to use the argsort to index into the array to also get
   the sorted array.
  
   Many years ago I needed something similar, so I made some functions
   for
   sorting and argsorting in one single shot.  Maybe you want to reuse
   them.  Here it is an example of the C implementation:
  
   https://github.com/PyTables/PyTables/blob/develop/src/idx-opt.c#L619
  
   and here the Cython wrapper for all of them:
  
  
  
   https://github.com/PyTables/PyTables/blob/develop/tables/indexesextension.pyx#L129
  
   Francesc
  
 
  that doesn't really make a big difference if the data is randomly
  distributed.
  the sorting operation is normally much more expensive than latter
  applying the indices:
 
  In [1]: d = np.arange(1000)
 
  In [2]: np.random.shuffle(d)
 
  In [3]: %timeit  np.argsort(d)
  1 loops, best of 3: 1.99 s per loop
 
  In [4]: idx = np.argsort(d)
 
  In [5]: %timeit d[idx]
  1 loops, best of 3: 213 ms per loop
 
 
 
  But if your data is not random it can make a difference as even
  quicksort can be a lot faster then.
  timsort would be a nice addition to numpy, it performs very well for
  partially sorted data. Unfortunately its quite complicated to
  implement.
 
 
  Quicksort and shellsort gain speed by having simple inner loops. I have
  the
  impression that timsort is optimal when compares and memory access are
  expensive, but I haven't seen any benchmarks for native types in
  contiguous
  memory.

 I found some benchmarks for continuous memory here:

 https://github.com/swenson/sort/
 https://github.com/gfx/cpp-TimSort

 The first one seems the best, it probably can be directly reused in numpy.
 The only issue is that it only sorts the array, but does not provide
 argsort.


 I'm impressed by the heapsort time. Heapsort is the slowest of the numpy
 sorts. So either the heapsort implementation is better than ours or the
 other sort are worse ;)

 Partially sorted sequence are pretty common, so timsort might be a worthy
 addition. Last time I looked, JDK was using timsort for sorting objects, and
 quicksort for native types. Another sort is dual pivot quicksort that I've
 heard some good things about.

 Adding indirect sorts isn't so difficult once the basic sort is available.
 Since the memory access tends to be larger as it gets randomly accessed,
 timsort might be a good choice for that.

Indeed, I think one has to be very careful about these benchmarks, since
it highly depends on the structure of the arrays being sorted.

I've been looking into this a bit, since I need some fast algorithm in Fortran,
that returns indices that sort the array. So far I use quicksort, but
this Timsort
might perform better for partially sorted arrays, which is typically
my use case.

Ondrej
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-21 Thread Ondřej Čertík
On Mon, Feb 17, 2014 at 11:40 AM, Charles R Harris
charlesr.har...@gmail.com wrote:



 On Mon, Feb 17, 2014 at 11:32 AM, Julian Taylor
 jtaylor.deb...@googlemail.com wrote:

 On 17.02.2014 15:18, Francesc Alted wrote:
  On 2/17/14, 1:08 AM, josef.p...@gmail.com wrote:
  On Sun, Feb 16, 2014 at 6:12 PM, Daπid davidmen...@gmail.com wrote:
  On 16 February 2014 23:43, josef.p...@gmail.com wrote:
  What's the fastest argsort for a 1d array with around 28 Million
  elements, roughly uniformly distributed, random order?
 
  On numpy latest version:
 
  for kind in ['quicksort', 'mergesort', 'heapsort']:
   print kind
   %timeit np.sort(data, kind=kind)
   %timeit np.argsort(data, kind=kind)
 
 
  quicksort
  1 loops, best of 3: 3.55 s per loop
  1 loops, best of 3: 10.3 s per loop
  mergesort
  1 loops, best of 3: 4.84 s per loop
  1 loops, best of 3: 9.49 s per loop
  heapsort
  1 loops, best of 3: 12.1 s per loop
  1 loops, best of 3: 39.3 s per loop
 
 
  It looks quicksort is quicker sorting, but mergesort is marginally
  faster
  sorting args. The diference is slim, but upon repetition, it remains
  significant.
 
  Why is that? Probably part of the reason is what Eelco said, and part
  is
  that in sort comparison are done accessing the array elements
  directly, but
  in argsort you have to index the array, introducing some overhead.
  Thanks, both.
 
  I also gain a second with mergesort.
 
  matlab would be nicer in my case, it returns both.
  I still need to use the argsort to index into the array to also get
  the sorted array.
 
  Many years ago I needed something similar, so I made some functions for
  sorting and argsorting in one single shot.  Maybe you want to reuse
  them.  Here it is an example of the C implementation:
 
  https://github.com/PyTables/PyTables/blob/develop/src/idx-opt.c#L619
 
  and here the Cython wrapper for all of them:
 
 
  https://github.com/PyTables/PyTables/blob/develop/tables/indexesextension.pyx#L129
 
  Francesc
 

 that doesn't really make a big difference if the data is randomly
 distributed.
 the sorting operation is normally much more expensive than latter
 applying the indices:

 In [1]: d = np.arange(1000)

 In [2]: np.random.shuffle(d)

 In [3]: %timeit  np.argsort(d)
 1 loops, best of 3: 1.99 s per loop

 In [4]: idx = np.argsort(d)

 In [5]: %timeit d[idx]
 1 loops, best of 3: 213 ms per loop



 But if your data is not random it can make a difference as even
 quicksort can be a lot faster then.
 timsort would be a nice addition to numpy, it performs very well for
 partially sorted data. Unfortunately its quite complicated to implement.


 Quicksort and shellsort gain speed by having simple inner loops. I have the
 impression that timsort is optimal when compares and memory access are
 expensive, but I haven't seen any benchmarks for native types in contiguous
 memory.

I found some benchmarks for continuous memory here:

https://github.com/swenson/sort/
https://github.com/gfx/cpp-TimSort

The first one seems the best, it probably can be directly reused in numpy.
The only issue is that it only sorts the array, but does not provide argsort.

Ondrej
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-21 Thread Charles R Harris
On Fri, Feb 21, 2014 at 10:35 PM, Ondřej Čertík ondrej.cer...@gmail.comwrote:

 On Mon, Feb 17, 2014 at 11:40 AM, Charles R Harris
 charlesr.har...@gmail.com wrote:
 
 
 
  On Mon, Feb 17, 2014 at 11:32 AM, Julian Taylor
  jtaylor.deb...@googlemail.com wrote:
 
  On 17.02.2014 15:18, Francesc Alted wrote:
   On 2/17/14, 1:08 AM, josef.p...@gmail.com wrote:
   On Sun, Feb 16, 2014 at 6:12 PM, Daπid davidmen...@gmail.com
 wrote:
   On 16 February 2014 23:43, josef.p...@gmail.com wrote:
   What's the fastest argsort for a 1d array with around 28 Million
   elements, roughly uniformly distributed, random order?
  
   On numpy latest version:
  
   for kind in ['quicksort', 'mergesort', 'heapsort']:
print kind
%timeit np.sort(data, kind=kind)
%timeit np.argsort(data, kind=kind)
  
  
   quicksort
   1 loops, best of 3: 3.55 s per loop
   1 loops, best of 3: 10.3 s per loop
   mergesort
   1 loops, best of 3: 4.84 s per loop
   1 loops, best of 3: 9.49 s per loop
   heapsort
   1 loops, best of 3: 12.1 s per loop
   1 loops, best of 3: 39.3 s per loop
  
  
   It looks quicksort is quicker sorting, but mergesort is marginally
   faster
   sorting args. The diference is slim, but upon repetition, it remains
   significant.
  
   Why is that? Probably part of the reason is what Eelco said, and
 part
   is
   that in sort comparison are done accessing the array elements
   directly, but
   in argsort you have to index the array, introducing some overhead.
   Thanks, both.
  
   I also gain a second with mergesort.
  
   matlab would be nicer in my case, it returns both.
   I still need to use the argsort to index into the array to also get
   the sorted array.
  
   Many years ago I needed something similar, so I made some functions
 for
   sorting and argsorting in one single shot.  Maybe you want to reuse
   them.  Here it is an example of the C implementation:
  
   https://github.com/PyTables/PyTables/blob/develop/src/idx-opt.c#L619
  
   and here the Cython wrapper for all of them:
  
  
  
 https://github.com/PyTables/PyTables/blob/develop/tables/indexesextension.pyx#L129
  
   Francesc
  
 
  that doesn't really make a big difference if the data is randomly
  distributed.
  the sorting operation is normally much more expensive than latter
  applying the indices:
 
  In [1]: d = np.arange(1000)
 
  In [2]: np.random.shuffle(d)
 
  In [3]: %timeit  np.argsort(d)
  1 loops, best of 3: 1.99 s per loop
 
  In [4]: idx = np.argsort(d)
 
  In [5]: %timeit d[idx]
  1 loops, best of 3: 213 ms per loop
 
 
 
  But if your data is not random it can make a difference as even
  quicksort can be a lot faster then.
  timsort would be a nice addition to numpy, it performs very well for
  partially sorted data. Unfortunately its quite complicated to implement.
 
 
  Quicksort and shellsort gain speed by having simple inner loops. I have
 the
  impression that timsort is optimal when compares and memory access are
  expensive, but I haven't seen any benchmarks for native types in
 contiguous
  memory.

 I found some benchmarks for continuous memory here:

 https://github.com/swenson/sort/
 https://github.com/gfx/cpp-TimSort

 The first one seems the best, it probably can be directly reused in numpy.
 The only issue is that it only sorts the array, but does not provide
 argsort.


I'm impressed by the heapsort time. Heapsort is the slowest of the numpy
sorts. So either the heapsort implementation is better than ours or the
other sort are worse ;)

Partially sorted sequence are pretty common, so timsort might be a worthy
addition. Last time I looked, JDK was using timsort for sorting objects,
and quicksort for native types. Another sort is dual pivot quicksort that
I've heard some good things about.

Adding indirect sorts isn't so difficult once the basic sort is available.
Since the memory access tends to be larger as it gets randomly accessed,
timsort might be a good choice for that.

Chuck
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-17 Thread Francesc Alted
On 2/17/14, 1:08 AM, josef.p...@gmail.com wrote:
 On Sun, Feb 16, 2014 at 6:12 PM, Daπid davidmen...@gmail.com wrote:
 On 16 February 2014 23:43, josef.p...@gmail.com wrote:
 What's the fastest argsort for a 1d array with around 28 Million
 elements, roughly uniformly distributed, random order?

 On numpy latest version:

 for kind in ['quicksort', 'mergesort', 'heapsort']:
  print kind
  %timeit np.sort(data, kind=kind)
  %timeit np.argsort(data, kind=kind)


 quicksort
 1 loops, best of 3: 3.55 s per loop
 1 loops, best of 3: 10.3 s per loop
 mergesort
 1 loops, best of 3: 4.84 s per loop
 1 loops, best of 3: 9.49 s per loop
 heapsort
 1 loops, best of 3: 12.1 s per loop
 1 loops, best of 3: 39.3 s per loop


 It looks quicksort is quicker sorting, but mergesort is marginally faster
 sorting args. The diference is slim, but upon repetition, it remains
 significant.

 Why is that? Probably part of the reason is what Eelco said, and part is
 that in sort comparison are done accessing the array elements directly, but
 in argsort you have to index the array, introducing some overhead.
 Thanks, both.

 I also gain a second with mergesort.

 matlab would be nicer in my case, it returns both.
 I still need to use the argsort to index into the array to also get
 the sorted array.

Many years ago I needed something similar, so I made some functions for 
sorting and argsorting in one single shot.  Maybe you want to reuse 
them.  Here it is an example of the C implementation:

https://github.com/PyTables/PyTables/blob/develop/src/idx-opt.c#L619

and here the Cython wrapper for all of them:

https://github.com/PyTables/PyTables/blob/develop/tables/indexesextension.pyx#L129

Francesc


 Josef


 I seem unable to find the code for ndarray.sort, so I can't check. I have
 tried to grep it tring all possible combinations of def ndarray,
 self.sort, etc. Where is it?


 /David.


 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


-- 
Francesc Alted

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-17 Thread josef . pktd
On Mon, Feb 17, 2014 at 9:18 AM, Francesc Alted franc...@continuum.io wrote:
 On 2/17/14, 1:08 AM, josef.p...@gmail.com wrote:
 On Sun, Feb 16, 2014 at 6:12 PM, Daπid davidmen...@gmail.com wrote:
 On 16 February 2014 23:43, josef.p...@gmail.com wrote:
 What's the fastest argsort for a 1d array with around 28 Million
 elements, roughly uniformly distributed, random order?

 On numpy latest version:

 for kind in ['quicksort', 'mergesort', 'heapsort']:
  print kind
  %timeit np.sort(data, kind=kind)
  %timeit np.argsort(data, kind=kind)


 quicksort
 1 loops, best of 3: 3.55 s per loop
 1 loops, best of 3: 10.3 s per loop
 mergesort
 1 loops, best of 3: 4.84 s per loop
 1 loops, best of 3: 9.49 s per loop
 heapsort
 1 loops, best of 3: 12.1 s per loop
 1 loops, best of 3: 39.3 s per loop


 It looks quicksort is quicker sorting, but mergesort is marginally faster
 sorting args. The diference is slim, but upon repetition, it remains
 significant.

 Why is that? Probably part of the reason is what Eelco said, and part is
 that in sort comparison are done accessing the array elements directly, but
 in argsort you have to index the array, introducing some overhead.
 Thanks, both.

 I also gain a second with mergesort.

 matlab would be nicer in my case, it returns both.
 I still need to use the argsort to index into the array to also get
 the sorted array.

 Many years ago I needed something similar, so I made some functions for
 sorting and argsorting in one single shot.  Maybe you want to reuse
 them.  Here it is an example of the C implementation:

 https://github.com/PyTables/PyTables/blob/develop/src/idx-opt.c#L619

 and here the Cython wrapper for all of them:

 https://github.com/PyTables/PyTables/blob/develop/tables/indexesextension.pyx#L129


Thanks Francesc

That would be very useful to have.
However, I don't speak C, and it would require too much maintenance
time if I were to include that in statsmodels.

I'm trying to concentrate more on stats (and my backlog there), and
leave other parts to developers that know those better.

Josef


 Francesc


 Josef


 I seem unable to find the code for ndarray.sort, so I can't check. I have
 tried to grep it tring all possible combinations of def ndarray,
 self.sort, etc. Where is it?


 /David.


 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


 --
 Francesc Alted

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-17 Thread Julian Taylor
On 17.02.2014 15:18, Francesc Alted wrote:
 On 2/17/14, 1:08 AM, josef.p...@gmail.com wrote:
 On Sun, Feb 16, 2014 at 6:12 PM, Daπid davidmen...@gmail.com wrote:
 On 16 February 2014 23:43, josef.p...@gmail.com wrote:
 What's the fastest argsort for a 1d array with around 28 Million
 elements, roughly uniformly distributed, random order?

 On numpy latest version:

 for kind in ['quicksort', 'mergesort', 'heapsort']:
  print kind
  %timeit np.sort(data, kind=kind)
  %timeit np.argsort(data, kind=kind)


 quicksort
 1 loops, best of 3: 3.55 s per loop
 1 loops, best of 3: 10.3 s per loop
 mergesort
 1 loops, best of 3: 4.84 s per loop
 1 loops, best of 3: 9.49 s per loop
 heapsort
 1 loops, best of 3: 12.1 s per loop
 1 loops, best of 3: 39.3 s per loop


 It looks quicksort is quicker sorting, but mergesort is marginally faster
 sorting args. The diference is slim, but upon repetition, it remains
 significant.

 Why is that? Probably part of the reason is what Eelco said, and part is
 that in sort comparison are done accessing the array elements directly, but
 in argsort you have to index the array, introducing some overhead.
 Thanks, both.

 I also gain a second with mergesort.

 matlab would be nicer in my case, it returns both.
 I still need to use the argsort to index into the array to also get
 the sorted array.
 
 Many years ago I needed something similar, so I made some functions for 
 sorting and argsorting in one single shot.  Maybe you want to reuse 
 them.  Here it is an example of the C implementation:
 
 https://github.com/PyTables/PyTables/blob/develop/src/idx-opt.c#L619
 
 and here the Cython wrapper for all of them:
 
 https://github.com/PyTables/PyTables/blob/develop/tables/indexesextension.pyx#L129
 
 Francesc
 

that doesn't really make a big difference if the data is randomly
distributed.
the sorting operation is normally much more expensive than latter
applying the indices:

In [1]: d = np.arange(1000)

In [2]: np.random.shuffle(d)

In [3]: %timeit  np.argsort(d)
1 loops, best of 3: 1.99 s per loop

In [4]: idx = np.argsort(d)

In [5]: %timeit d[idx]
1 loops, best of 3: 213 ms per loop



But if your data is not random it can make a difference as even
quicksort can be a lot faster then.
timsort would be a nice addition to numpy, it performs very well for
partially sorted data. Unfortunately its quite complicated to implement.
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-17 Thread Charles R Harris
On Mon, Feb 17, 2014 at 11:32 AM, Julian Taylor 
jtaylor.deb...@googlemail.com wrote:

 On 17.02.2014 15:18, Francesc Alted wrote:
  On 2/17/14, 1:08 AM, josef.p...@gmail.com wrote:
  On Sun, Feb 16, 2014 at 6:12 PM, Daπid davidmen...@gmail.com wrote:
  On 16 February 2014 23:43, josef.p...@gmail.com wrote:
  What's the fastest argsort for a 1d array with around 28 Million
  elements, roughly uniformly distributed, random order?
 
  On numpy latest version:
 
  for kind in ['quicksort', 'mergesort', 'heapsort']:
   print kind
   %timeit np.sort(data, kind=kind)
   %timeit np.argsort(data, kind=kind)
 
 
  quicksort
  1 loops, best of 3: 3.55 s per loop
  1 loops, best of 3: 10.3 s per loop
  mergesort
  1 loops, best of 3: 4.84 s per loop
  1 loops, best of 3: 9.49 s per loop
  heapsort
  1 loops, best of 3: 12.1 s per loop
  1 loops, best of 3: 39.3 s per loop
 
 
  It looks quicksort is quicker sorting, but mergesort is marginally
 faster
  sorting args. The diference is slim, but upon repetition, it remains
  significant.
 
  Why is that? Probably part of the reason is what Eelco said, and part
 is
  that in sort comparison are done accessing the array elements
 directly, but
  in argsort you have to index the array, introducing some overhead.
  Thanks, both.
 
  I also gain a second with mergesort.
 
  matlab would be nicer in my case, it returns both.
  I still need to use the argsort to index into the array to also get
  the sorted array.
 
  Many years ago I needed something similar, so I made some functions for
  sorting and argsorting in one single shot.  Maybe you want to reuse
  them.  Here it is an example of the C implementation:
 
  https://github.com/PyTables/PyTables/blob/develop/src/idx-opt.c#L619
 
  and here the Cython wrapper for all of them:
 
 
 https://github.com/PyTables/PyTables/blob/develop/tables/indexesextension.pyx#L129
 
  Francesc
 

 that doesn't really make a big difference if the data is randomly
 distributed.
 the sorting operation is normally much more expensive than latter
 applying the indices:

 In [1]: d = np.arange(1000)

 In [2]: np.random.shuffle(d)

 In [3]: %timeit  np.argsort(d)
 1 loops, best of 3: 1.99 s per loop

 In [4]: idx = np.argsort(d)

 In [5]: %timeit d[idx]
 1 loops, best of 3: 213 ms per loop



 But if your data is not random it can make a difference as even
 quicksort can be a lot faster then.
 timsort would be a nice addition to numpy, it performs very well for
 partially sorted data. Unfortunately its quite complicated to implement.


Quicksort and shellsort gain speed by having simple inner loops. I have the
impression that timsort is optimal when compares and memory access are
expensive, but I haven't seen any benchmarks for native types in contiguous
memory.

Chuck
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


[Numpy-discussion] argsort speed

2014-02-16 Thread josef . pktd
currently using numpy 1.6.1

What's the fastest argsort for a 1d array with around 28 Million
elements, roughly uniformly distributed, random order?

Is there a reason that np.argsort is almost 3 times slower than np.sort?

I'm doing semi-systematic timing for a stats(models) algorithm.

Josef
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-16 Thread Eelco Hoogendoorn

My guess;

First of all, you are actually manipulating twice as much data as opposed to 
an inplace sort.

Moreover, an inplace sort gains locality as it is being sorted, whereas the 
argsort is continuously making completely random memory accesses.


-Original Message- 
From: josef.p...@gmail.com
Sent: Sunday, February 16, 2014 11:43 PM
To: Discussion of Numerical Python
Subject: [Numpy-discussion] argsort speed

currently using numpy 1.6.1

What's the fastest argsort for a 1d array with around 28 Million
elements, roughly uniformly distributed, random order?

Is there a reason that np.argsort is almost 3 times slower than np.sort?

I'm doing semi-systematic timing for a stats(models) algorithm.

Josef
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion 

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-16 Thread Daπid
On 16 February 2014 23:43, josef.p...@gmail.com wrote:

 What's the fastest argsort for a 1d array with around 28 Million
 elements, roughly uniformly distributed, random order?


On numpy latest version:

for kind in ['quicksort', 'mergesort', 'heapsort']:
print kind
%timeit np.sort(data, kind=kind)
%timeit np.argsort(data, kind=kind)


quicksort
1 loops, best of 3: 3.55 s per loop
1 loops, best of 3: 10.3 s per loop
mergesort
1 loops, best of 3: 4.84 s per loop
1 loops, best of 3: 9.49 s per loop
heapsort
1 loops, best of 3: 12.1 s per loop
1 loops, best of 3: 39.3 s per loop


It looks quicksort is quicker sorting, but mergesort is marginally faster
sorting args. The diference is slim, but upon repetition, it remains
significant.

Why is that? Probably part of the reason is what Eelco said, and part is
that in sort comparison are done accessing the array elements directly, but
in argsort you have to index the array, introducing some overhead.

I seem unable to find the code for ndarray.sort, so I can't check. I have
tried to grep it tring all possible combinations of def ndarray,
self.sort, etc. Where is it?


/David.
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-16 Thread Daπid
On 17 February 2014 00:12, Daπid davidmen...@gmail.com wrote:

 I seem unable to find the code for ndarray.sort, so I can't check. I have
 tried to grep it tring all possible combinations of def ndarray,
 self.sort, etc. Where is it?



Nevermind, it is in core/src/multiarray/methods.c
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-16 Thread josef . pktd
On Sun, Feb 16, 2014 at 5:50 PM, Eelco Hoogendoorn
hoogendoorn.ee...@gmail.com wrote:

 My guess;

 First of all, you are actually manipulating twice as much data as opposed to
 an inplace sort.

 Moreover, an inplace sort gains locality as it is being sorted, whereas the
 argsort is continuously making completely random memory accesses.


 -Original Message-
 From: josef.p...@gmail.com
 Sent: Sunday, February 16, 2014 11:43 PM
 To: Discussion of Numerical Python
 Subject: [Numpy-discussion] argsort speed

 currently using numpy 1.6.1

 What's the fastest argsort for a 1d array with around 28 Million
 elements, roughly uniformly distributed, random order?

 Is there a reason that np.argsort is almost 3 times slower than np.sort?

 I'm doing semi-systematic timing for a stats(models) algorithm.

I was using np.sort, inplace sort is only a little bit faster

It looks like sorting first, and then argsorting is faster than argsort alon

pvals.sort()
sortind = np.argsort(pvals)

replacing the inplace sort in the above reduces speed only a bit

--
import time
use_master = True
if use_master:
import sys
sys.path.insert(0,
rE:\Josef\!reps\numpy\dist\Programs\Python27\Lib\site-packages)

import numpy as np
print np.__version__ =, np.__version__

n = 5300
pvals = np.random.rand(n**2)

t0 = time.time()

p = np.sort(pvals)
t1 = time.time()

sortind = np.argsort(pvals)
t2 = time.time()

pvals.sort()
sortind = np.argsort(pvals)
t3 = time.time()

print t1 - t0, t2 - t1, t3 - t2
print (t2 - t1) * 1. / (t1 - t0),  (t3 - t2) * 1. / (t1 - t0)


np.__version__ = 1.9.0.dev-2868dc4
3.91900014877 9.556218 4.92900013924
2.43863219163 1.2577187936

Josef



 Josef
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-16 Thread josef . pktd
On Sun, Feb 16, 2014 at 6:15 PM,  josef.p...@gmail.com wrote:
 On Sun, Feb 16, 2014 at 5:50 PM, Eelco Hoogendoorn
 hoogendoorn.ee...@gmail.com wrote:

 My guess;

 First of all, you are actually manipulating twice as much data as opposed to
 an inplace sort.

 Moreover, an inplace sort gains locality as it is being sorted, whereas the
 argsort is continuously making completely random memory accesses.


 -Original Message-
 From: josef.p...@gmail.com
 Sent: Sunday, February 16, 2014 11:43 PM
 To: Discussion of Numerical Python
 Subject: [Numpy-discussion] argsort speed

 currently using numpy 1.6.1

 What's the fastest argsort for a 1d array with around 28 Million
 elements, roughly uniformly distributed, random order?

 Is there a reason that np.argsort is almost 3 times slower than np.sort?

 I'm doing semi-systematic timing for a stats(models) algorithm.

 I was using np.sort, inplace sort is only a little bit faster

 It looks like sorting first, and then argsorting is faster than argsort alon

 pvals.sort()
 sortind = np.argsort(pvals)

Ok, that was useless, that won't be anything I want.

Josef



 replacing the inplace sort in the above reduces speed only a bit

 --
 import time
 use_master = True
 if use_master:
 import sys
 sys.path.insert(0,
 rE:\Josef\!reps\numpy\dist\Programs\Python27\Lib\site-packages)

 import numpy as np
 print np.__version__ =, np.__version__

 n = 5300
 pvals = np.random.rand(n**2)

 t0 = time.time()

 p = np.sort(pvals)
 t1 = time.time()

 sortind = np.argsort(pvals)
 t2 = time.time()

 pvals.sort()
 sortind = np.argsort(pvals)
 t3 = time.time()

 print t1 - t0, t2 - t1, t3 - t2
 print (t2 - t1) * 1. / (t1 - t0),  (t3 - t2) * 1. / (t1 - t0)
 

 np.__version__ = 1.9.0.dev-2868dc4
 3.91900014877 9.556218 4.92900013924
 2.43863219163 1.2577187936

 Josef



 Josef
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-16 Thread josef . pktd
On Sun, Feb 16, 2014 at 6:12 PM, Daπid davidmen...@gmail.com wrote:
 On 16 February 2014 23:43, josef.p...@gmail.com wrote:

 What's the fastest argsort for a 1d array with around 28 Million
 elements, roughly uniformly distributed, random order?


 On numpy latest version:

 for kind in ['quicksort', 'mergesort', 'heapsort']:
 print kind
 %timeit np.sort(data, kind=kind)
 %timeit np.argsort(data, kind=kind)


 quicksort
 1 loops, best of 3: 3.55 s per loop
 1 loops, best of 3: 10.3 s per loop
 mergesort
 1 loops, best of 3: 4.84 s per loop
 1 loops, best of 3: 9.49 s per loop
 heapsort
 1 loops, best of 3: 12.1 s per loop
 1 loops, best of 3: 39.3 s per loop


 It looks quicksort is quicker sorting, but mergesort is marginally faster
 sorting args. The diference is slim, but upon repetition, it remains
 significant.

 Why is that? Probably part of the reason is what Eelco said, and part is
 that in sort comparison are done accessing the array elements directly, but
 in argsort you have to index the array, introducing some overhead.

Thanks, both.

I also gain a second with mergesort.

matlab would be nicer in my case, it returns both.
I still need to use the argsort to index into the array to also get
the sorted array.

Josef



 I seem unable to find the code for ndarray.sort, so I can't check. I have
 tried to grep it tring all possible combinations of def ndarray,
 self.sort, etc. Where is it?


 /David.


 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-16 Thread Charles R Harris
On Sun, Feb 16, 2014 at 4:18 PM, josef.p...@gmail.com wrote:

 On Sun, Feb 16, 2014 at 6:15 PM,  josef.p...@gmail.com wrote:
  On Sun, Feb 16, 2014 at 5:50 PM, Eelco Hoogendoorn
  hoogendoorn.ee...@gmail.com wrote:
 
  My guess;
 
  First of all, you are actually manipulating twice as much data as
 opposed to
  an inplace sort.
 
  Moreover, an inplace sort gains locality as it is being sorted, whereas
 the
  argsort is continuously making completely random memory accesses.
 
 
  -Original Message-
  From: josef.p...@gmail.com
  Sent: Sunday, February 16, 2014 11:43 PM
  To: Discussion of Numerical Python
  Subject: [Numpy-discussion] argsort speed
 
  currently using numpy 1.6.1
 
  What's the fastest argsort for a 1d array with around 28 Million
  elements, roughly uniformly distributed, random order?
 
  Is there a reason that np.argsort is almost 3 times slower than np.sort?
 
  I'm doing semi-systematic timing for a stats(models) algorithm.
 
  I was using np.sort, inplace sort is only a little bit faster
 
  It looks like sorting first, and then argsorting is faster than argsort
 alon
 
  pvals.sort()
  sortind = np.argsort(pvals)

 Ok, that was useless, that won't be anything I want.


I think locality is the most important thing. The argsort routines used to
move both the indexes and the array to argsort, the new ones only move the
indexes. It is a tradeoff, twice as many moves vs locality. It's probably
possible to invent an algorithm that mixes the two.

snip

Chuck
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-16 Thread josef . pktd
On Sun, Feb 16, 2014 at 7:13 PM, Charles R Harris
charlesr.har...@gmail.com wrote:



 On Sun, Feb 16, 2014 at 4:18 PM, josef.p...@gmail.com wrote:

 On Sun, Feb 16, 2014 at 6:15 PM,  josef.p...@gmail.com wrote:
  On Sun, Feb 16, 2014 at 5:50 PM, Eelco Hoogendoorn
  hoogendoorn.ee...@gmail.com wrote:
 
  My guess;
 
  First of all, you are actually manipulating twice as much data as
  opposed to
  an inplace sort.
 
  Moreover, an inplace sort gains locality as it is being sorted, whereas
  the
  argsort is continuously making completely random memory accesses.
 
 
  -Original Message-
  From: josef.p...@gmail.com
  Sent: Sunday, February 16, 2014 11:43 PM
  To: Discussion of Numerical Python
  Subject: [Numpy-discussion] argsort speed
 
  currently using numpy 1.6.1
 
  What's the fastest argsort for a 1d array with around 28 Million
  elements, roughly uniformly distributed, random order?
 
  Is there a reason that np.argsort is almost 3 times slower than
  np.sort?
 
  I'm doing semi-systematic timing for a stats(models) algorithm.
 
  I was using np.sort, inplace sort is only a little bit faster
 
  It looks like sorting first, and then argsorting is faster than argsort
  alon
 
  pvals.sort()
  sortind = np.argsort(pvals)

 Ok, that was useless, that won't be anything I want.


 I think locality is the most important thing. The argsort routines used to
 move both the indexes and the array to argsort, the new ones only move the
 indexes. It is a tradeoff, twice as many moves vs locality. It's probably
 possible to invent an algorithm that mixes the two.

If that's the way it is, then that's the way it is.

I just never realized that argsort can take so long, since I usually
use only smaller arrays.
I was surprised that argsort took almost 10 out of around 12 seconds
in my function, and this after I cleaned up my code and removed
duplicate and avoidable argsorts.

Josef



 snip

 Chuck

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] argsort speed

2014-02-16 Thread Charles R Harris
On Sun, Feb 16, 2014 at 4:12 PM, Daπid davidmen...@gmail.com wrote:

 On 16 February 2014 23:43, josef.p...@gmail.com wrote:

 What's the fastest argsort for a 1d array with around 28 Million
 elements, roughly uniformly distributed, random order?


 On numpy latest version:

 for kind in ['quicksort', 'mergesort', 'heapsort']:
 print kind
 %timeit np.sort(data, kind=kind)
 %timeit np.argsort(data, kind=kind)


 quicksort
 1 loops, best of 3: 3.55 s per loop
 1 loops, best of 3: 10.3 s per loop
 mergesort
 1 loops, best of 3: 4.84 s per loop
 1 loops, best of 3: 9.49 s per loop
 heapsort
 1 loops, best of 3: 12.1 s per loop
 1 loops, best of 3: 39.3 s per loop


Interesting. I get slightly different results

quicksort
1 loops, best of 3: 3.25 s per loop
1 loops, best of 3: 6.16 s per loop
mergesort
1 loops, best of 3: 3.99 s per loop
1 loops, best of 3: 6.97 s per loop
heapsort
1 loops, best of 3: 10.1 s per loop
1 loops, best of 3: 29.3 s per loop

Possibly faster memory here.

snip

Chuck
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion