pro printTimes, pythontimes, idltimes, TIMED = timed
compile_opt idl2
;check if we have a name for the process to print with the mean
if ~keyword_set(timed) then begin
add = ' time (seconds):'
endif else begin
add = timed + ' time (seconds):'
endelse
print, 'Average ' + add
print, ' Python : ' + strtrim(pythontimes.mean(),2) + ' +/- ' + strtrim(stddev(pythontimes),2)
print, ' IDL : ' + strtrim(idltimes.mean(),2) + ' +/- ' + strtrim(stddev(idltimes),2)
print, 'Total time (seconds):'
print, ' Python : ' + strtrim(total(pythontimes),2)
print, ' IDL : ' + strtrim(total(idltimes),2)
print, 'Python/IDL time ratio: ' + strtrim(total(pythontimes)/total(idltimes),2)
end
pro python_test
compile_opt idl2
;initialize Python
>>> 'import numpy as np'
>>> 'import time'
>>> 'import math'
>>> 'from idlpy import *'
>>> 'from skimage.filters import roberts, sobel, prewitt'
;number of times we want to run each test
nloops = 3
;array dimensions for iterator tests
dims = 10000
;>>>'dims = ' + strtrim(dims,2)
python.dims = dims
;array dimensions for filter tests
dims_filter = 10000
python.dims_filter = dims_filter
;initialize arrays to hol dpython times
pythontimes = fltarr(nloops)
idltimes = fltarr(nloops)
;test array creation in Python and IDL
for i=0,nloops-1 do begin
tStart = systime(/seconds)
>>> 'arr = np.ones((dims,dims))'
tEndPython = systime(/seconds)
arr = fltarr(dims,dims)
tEndIDL = systime(/seconds)
;save the times
pythontimes[i] = tEndPython - tStart
idltimes[i] = tEndIDL - tEndPython
endfor
print
printTimes, pythontimes, idltimes, TIMED = 'array creation'
;check type conversion times
for i=0,nloops-1 do begin
tStart = systime(/seconds)
>>> 'arr2 = arr.astype(int)'
tEndPython = systime(/seconds)
arr2 = fix(arr)
tEndIDL = systime(/seconds)
;save the times
pythontimes[i] = tEndPython - tStart
idltimes[i] = tEndIDL - tEndPython
endfor
print
printTimes, pythontimes, idltimes, TIMED = 'array data type conversion'
;check index array creation times
for i=0,nloops-1 do begin
tStart = systime(/seconds)
>>> 'arr = np.arange(0, dims*dims, dtype=long)'
tEndPython = systime(/seconds)
arr = lindgen(dims*dims)
tEndIDL = systime(/seconds)
;save the times
pythontimes[i] = tEndPython - tStart
idltimes[i] = tEndIDL - tEndPython
endfor
print
printTimes, pythontimes, idltimes, TIMED = 'index array creation'
;check adding values to array
for i=0,nloops-1 do begin
tStart = systime(/seconds)
>>> 'arr += 1'
tEndPython = systime(/seconds)
arr += 1
tEndIDL = systime(/seconds)
;save the times
pythontimes[i] = tEndPython - tStart
idltimes[i] = tEndIDL - tEndPython
endfor
print
printTimes, pythontimes, idltimes, TIMED = 'increasing array value'
;check complex math expressions with a single thread
pref_set, 'IDL_CPU_TPOOL_NTHREADS', 1, /commit
for i=0,nloops-1 do begin
tStart = systime(/seconds)
>>> 'y = np.sin(arr*arr)**.5'
tEndPython = systime(/seconds)
y = sqrt(sin(arr*arr))
tEndIDL = systime(/seconds)
;save the times
pythontimes[i] = tEndPython - tStart
idltimes[i] = tEndIDL - tEndPython
endfor
print
printTimes, pythontimes, idltimes, TIMED = 'complex math statements (' + strtrim(!CPU.TPOOL_NTHREADS,2) + ' thread)'
pref_set, 'IDL_CPU_TPOOL_NTHREADS', /default, /commit
;check complex math expressions with all threads
for i=0,nloops-1 do begin
tStart = systime(/seconds)
>>> 'y = np.sin(arr*arr)**.5'
tEndPython = systime(/seconds)
y = sqrt(sin(arr*arr))
tEndIDL = systime(/seconds)
;save the times
pythontimes[i] = tEndPython - tStart
idltimes[i] = tEndIDL - tEndPython
endfor
print
printTimes, pythontimes, idltimes, TIMED = 'complex math statements (' + strtrim(!CPU.TPOOL_NTHREADS,2) + ' thread)'
;check array element access times
nhere = 1
for i=0,nhere-1 do begin
tStart = systime(/seconds)
>>>'for x in np.nditer(arr):\n y=x'
tEndPython = systime(/seconds)
foreach x, arr do y = x
tEndIDL = systime(/seconds)
;save the times
pythontimes[i] = tEndPython - tStart
idltimes[i] = tEndIDL - tEndPython
endfor
print
printTimes, pythontimes[0:nhere-1], idltimes[0:nhere-1], TIMED = 'loop through array element'
;check times for image processing
im_dat = lonarr(dims_filter, dims_filter)
;set a square in the middle of the image to 1
im_dat[.4*dims_filter:.6*dims_filter,.4*dims_filter:.6*dims_filter] = 1
;send the array to Python as well
python.im_dat = im_dat
for i=0,nloops-1 do begin
tStart = systime(/seconds)
>>> 'edge_sobel = sobel(im_dat)'
>>> 'edge_roberts = roberts(im_dat)'
>>> 'edge_prewitt = prewitt(im_dat)'
tEndPython = systime(/seconds)
edge_sobel = sobel(im_dat)
edge_roberts = roberts(im_dat)
edge_prewitt = prewitt(im_dat)
tEndIDL = systime(/seconds)
;save the times
pythontimes[i] = tEndPython - tStart
idltimes[i] = tEndIDL - tEndPython
endfor
print
printTimes, pythontimes, idltimes, TIMED = 'image processing routines'
stop
end