The 32 to 2 second speed up is quite impressive!  But I want to help
you advance this even more so that your current 2 seconds drops down
to a millisecond scale!

Regards,

Edward



On 10 June 2014 15:05, Edward d'Auvergne <[email protected]> wrote:
> Removing the pA_arr and kex_arr structures will make this even faster:
>
> $ python -m timeit -n 100000 'import numpy as np; X = np.ones(100,
> np.float64); pA = 0.9; pA*X'
> 100000 loops, best of 3: 6.39 usec per loop
> $ python -m timeit -n 100000 'import numpy as np; X = np.ones(100,
> np.float64); pA = 0.9; pA_arr = np.array([pA]*100, np.float64); pA*X'
> 100000 loops, best of 3: 14.2 usec per loop
> $ python -m timeit -n 100000 'import numpy as np; X = np.ones(100,
> np.float64); pA = 0.9; pA_arr = np.array([pA]*100, np.float64);
> pA_arr*X'
> 100000 loops, best of 3: 13.9 usec per loop
>
> So the first one where pA_arr is not created is more than half the
> speed of the others.  This will remove some of the overhead that makes
> the single spin calculations slower.  I'm getting close to the end of
> the list of your changes now :)
>
> Regards,
>
> Edward
>
> On 10 June 2014 14:37, Troels Emtekær Linnet <[email protected]> wrote:
>> Hi Edward.
>>
>> When you have digged your way through, you will see that I end up with:
>> https://gna.org/task/?7807#comment56
>>
>> Going from 32.247 seconds to 2 second for a 100 clustered calculation.
>>
>> ! BUM!
>>
>> 2014-06-10 14:33 GMT+02:00 Edward d'Auvergne <[email protected]>:
>>> Hi,
>>>
>>> Maybe self.spins_a could be renamed as self.ones_array?  And
>>> self.not_spins_a could be self.zeros_array?  Or maybe self.ones_struct
>>> and self.zeros_struct?  The spin part is only one dimension of 5, so
>>> the name is confusing.  The name needs to have something to do with
>>> the ones and zeros, as well as the entire [ei][si][mi][oi][di]
>>> structure.
>>>
>>> Anyway, I can now see that pA_arr is most definitely not needed ;)
>>> Its removal will make the code much faster.  Try and see what happens!
>>>
>>> Regards,
>>>
>>> Edward
>>>
>>> On 10 June 2014 14:25, Troels Emtekær Linnet <[email protected]> wrote:
>>>> Hi Edward.
>>>>
>>>> spins_a is the multi dimensional numpy array
>>>> Of dimension [ei][si][mi][oi][di].
>>>> It consists of 1.0 on all places, where there are dispersion points.
>>>>
>>>> pA is just the float.
>>>>
>>>> So, I think we agree?
>>>>
>>>> The pA values has to end up in a multi dimensional array.
>>>>
>>>> All multiplications in the target functions has to broadcast to the same 
>>>> size.
>>>>
>>>> Numpy multiplication is elements vise.
>>>> In all dimensions.
>>>>
>>>>
>>>>
>>>> 2014-06-10 13:45 GMT+02:00 Edward d'Auvergne <[email protected]>:
>>>>> Hi,
>>>>>
>>>>> I don't think you even need the pA array.  What is the variable
>>>>> self.spins_a?  Simply try using pA directly.  Here is a demo:
>>>>>
>>>>> """
>>>>> from numpy import array, float64, ones
>>>>>
>>>>> a = ones(3)
>>>>> pA = 0.9
>>>>> pA_array = pA * a
>>>>>
>>>>> b = array([1, 2, 3], float64)
>>>>>
>>>>> print("\nFloat times array:")
>>>>> print(repr(pA * b))
>>>>> print("\nArray times array:")
>>>>> print(repr(pA_array * b))
>>>>> """
>>>>>
>>>>> If you run this, you will obtain the same result for both operations.
>>>>> Is there a good reason, that I cannot see, why the second option is
>>>>> required in the target functions?
>>>>>
>>>>> Cheers,
>>>>>
>>>>> Edward
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On 10 June 2014 12:09, Troels Emtekær Linnet <[email protected]> 
>>>>> wrote:
>>>>>> You are Correct !!!
>>>>>>
>>>>>> The final version is:
>>>>>> pA_arr = pA*self.spins_a
>>>>>>
>>>>>> The "trick" was to make a numpy multi dimensional spin array in the
>>>>>> __init__ function of the class.
>>>>>>
>>>>>> That is filled with 1.0 where there are dispersion points.
>>>>>>
>>>>>> This array essential replace the spin looping!
>>>>>>
>>>>>> Best
>>>>>> Troels
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> 2014-06-10 11:56 GMT+02:00 Edward d'Auvergne <[email protected]>:
>>>>>>> Hi Troels,
>>>>>>>
>>>>>>> From the dispersion equations, to me it looks like that you can keep
>>>>>>> pA as a single value.  Why have you converted it to an array
>>>>>>> structure?  You will have no problems as you can multiply any numpy
>>>>>>> array with a single float.  This should be the same for all model
>>>>>>> parameters, excluding dw and R20.  If you can use single values, that
>>>>>>> should be much quicker for the target functions.
>>>>>>>
>>>>>>> Regards,
>>>>>>>
>>>>>>> Edward
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On 8 June 2014 19:48,  <[email protected]> wrote:
>>>>>>>> Author: tlinnet
>>>>>>>> Date: Sun Jun  8 19:48:31 2014
>>>>>>>> New Revision: 23735
>>>>>>>>
>>>>>>>> URL: http://svn.gna.org/viewcvs/relax?rev=23735&view=rev
>>>>>>>> Log:
>>>>>>>> Important fix for the creation of the multi dimensional pA numpy array.
>>>>>>>>
>>>>>>>> It should be created as numpy.zeros([ei][si][mi][oi]) instead of 
>>>>>>>> numpy.ones([ei][si][mi][oi]).
>>>>>>>>
>>>>>>>> This allows for rapid testing of all dimensions with np.allclose(pA, 
>>>>>>>> numpy.ones(dw.shape)).
>>>>>>>> pA can have missing filled out values, when the number of dispersion 
>>>>>>>> points are different
>>>>>>>> per spectrometer frequency.
>>>>>>>>
>>>>>>>> Task #7807 (https://gna.org/task/index.php?7807): Speed-up of 
>>>>>>>> dispersion models for Clustered analysis.
>>>>>>>>
>>>>>>>> Modified:
>>>>>>>>     branches/disp_spin_speed/target_functions/relax_disp.py
>>>>>>>>
>>>>>>>> Modified: branches/disp_spin_speed/target_functions/relax_disp.py
>>>>>>>> URL: 
>>>>>>>> http://svn.gna.org/viewcvs/relax/branches/disp_spin_speed/target_functions/relax_disp.py?rev=23735&r1=23734&r2=23735&view=diff
>>>>>>>> ==============================================================================
>>>>>>>> --- branches/disp_spin_speed/target_functions/relax_disp.py     
>>>>>>>> (original)
>>>>>>>> +++ branches/disp_spin_speed/target_functions/relax_disp.py     Sun 
>>>>>>>> Jun  8 19:48:31 2014
>>>>>>>> @@ -411,7 +411,7 @@
>>>>>>>>              # The number of disp point can change per spectrometer, 
>>>>>>>> so we make the maximum size.
>>>>>>>>              self.R20A_a = np.ones(back_calc_shape + 
>>>>>>>> [self.max_num_disp_points])
>>>>>>>>              self.R20B_a = np.ones(back_calc_shape + 
>>>>>>>> [self.max_num_disp_points])
>>>>>>>> -            self.pA_a = np.ones(back_calc_shape + 
>>>>>>>> [self.max_num_disp_points])
>>>>>>>> +            self.pA_a = np.zeros(back_calc_shape + 
>>>>>>>> [self.max_num_disp_points])
>>>>>>>>              self.dw_frq_a = np.ones(back_calc_shape + 
>>>>>>>> [self.max_num_disp_points])
>>>>>>>>              self.kex_a = np.ones(back_calc_shape + 
>>>>>>>> [self.max_num_disp_points])
>>>>>>>>              self.cpmg_frqs_a = np.ones(back_calc_shape + 
>>>>>>>> [self.max_num_disp_points])
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> relax (http://www.nmr-relax.com)
>>>>>>>>
>>>>>>>> This is the relax-commits mailing list
>>>>>>>> [email protected]
>>>>>>>>
>>>>>>>> To unsubscribe from this list, get a password
>>>>>>>> reminder, or change your subscription options,
>>>>>>>> visit the list information page at
>>>>>>>> https://mail.gna.org/listinfo/relax-commits
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> relax (http://www.nmr-relax.com)
>>>>>>>
>>>>>>> This is the relax-devel mailing list
>>>>>>> [email protected]
>>>>>>>
>>>>>>> To unsubscribe from this list, get a password
>>>>>>> reminder, or change your subscription options,
>>>>>>> visit the list information page at
>>>>>>> https://mail.gna.org/listinfo/relax-devel

_______________________________________________
relax (http://www.nmr-relax.com)

This is the relax-devel mailing list
[email protected]

To unsubscribe from this list, get a password
reminder, or change your subscription options,
visit the list information page at
https://mail.gna.org/listinfo/relax-devel

Reply via email to