""" Comparison of several different ways of calculating a "ramp" function. C:\home\ej\wrk\junk\scipy\weave\examples>python ramp.py python (seconds*ratio): 128.149998188 arr[500]: 0.0500050005001 compiled numeric1 (seconds, speed up): 1.42199993134 90.1195530071 arr[500]: 0.0500050005001 compiled numeric2 (seconds, speed up): 0.950999975204 134.752893301 arr[500]: 0.0500050005001 compiled list1 (seconds, speed up): 53.100001812 2.41337088164 arr[500]: 0.0500050005001 compiled list4 (seconds, speed up): 30.5500030518 4.19476220578 arr[500]: 0.0500050005001 """ from __future__ import absolute_import, print_function import time import scipy.weave as weave from numpy import * def Ramp(result, size, start, end): step = (end-start)/(size-1) for i in xrange(size): result[i] = start + step*i def Ramp_numeric1(result,start,end): code = """ const int size = Nresult[0]; const double step = (end-start)/(size-1); double val = start; for (int i = 0; i < size; i++) *result++ = start + step*i; """ weave.inline(code,['result','start','end'],compiler='gcc') def Ramp_numeric2(result,start,end): code = """ const int size = Nresult[0]; double step = (end-start)/(size-1); double val = start; for (int i = 0; i < size; i++) { result[i] = val; val += step; } """ weave.inline(code,['result','start','end'],compiler='gcc') def Ramp_list1(result, start, end): code = """ const int size = result.len(); const double step = (end-start)/(size-1); for (int i = 0; i < size; i++) result[i] = start + step*i; """ weave.inline(code, ["result","start", "end"], verbose=2) def Ramp_list2(result, start, end): code = """ const int size = result.len(); const double step = (end-start)/(size-1); for (int i = 0; i < size; i++) { PyObject* val = PyFloat_FromDouble( start + step*i ); PySequence_SetItem(py_result,i, val); } """ weave.inline(code, ["result", "start", "end"], verbose=2) def main(): N_array = 10000 N_py = 200 N_c = 10000 ratio = float(N_c) / N_py arr = [0]*N_array t1 = time.time() for i in xrange(N_py): Ramp(arr, N_array, 0.0, 1.0) t2 = time.time() py_time = (t2 - t1) * ratio print('python (seconds*ratio):', py_time) print('arr[500]:', arr[500]) arr1 = array([0]*N_array,float) # First call compiles function or loads from cache. # I'm not including this in the timing. Ramp_numeric1(arr1, 0.0, 1.0) t1 = time.time() for i in xrange(N_c): Ramp_numeric1(arr1, 0.0, 1.0) t2 = time.time() c_time = (t2 - t1) print('compiled numeric1 (seconds, speed up):', c_time, py_time / c_time) print('arr[500]:', arr1[500]) arr2 = array([0]*N_array,float) # First call compiles function or loads from cache. # I'm not including this in the timing. Ramp_numeric2(arr2, 0.0, 1.0) t1 = time.time() for i in xrange(N_c): Ramp_numeric2(arr2, 0.0, 1.0) t2 = time.time() c_time = (t2 - t1) print('compiled numeric2 (seconds, speed up):', c_time, py_time / c_time) print('arr[500]:', arr2[500]) arr3 = [0]*N_array # First call compiles function or loads from cache. # I'm not including this in the timing. Ramp_list1(arr3, 0.0, 1.0) t1 = time.time() for i in xrange(N_py): Ramp_list1(arr3, 0.0, 1.0) t2 = time.time() c_time = (t2 - t1) * ratio print('compiled list1 (seconds, speed up):', c_time, py_time / c_time) print('arr[500]:', arr3[500]) arr4 = [0]*N_array # First call compiles function or loads from cache. # I'm not including this in the timing. Ramp_list2(arr4, 0.0, 1.0) t1 = time.time() for i in xrange(N_py): Ramp_list2(arr4, 0.0, 1.0) t2 = time.time() c_time = (t2 - t1) * ratio print('compiled list4 (seconds, speed up):', c_time, py_time / c_time) print('arr[500]:', arr4[500]) if __name__ == '__main__': main()