No rating

# What the *bleep* is IDL doing? Creating variables

Dain Cilke

The IDL language has many features which allow for quick and simple programming.  For example, say you have an INT array and you need to append a value to it:

intarray = [intarray,42]

Quick.  Simple.  However, just because you can do this doesn't mean you should.  Let's examine what is happening in the statement:

intarray = [intarray,42]

First, IDL has to create a temporary array to hold intarray and the new value.  Then, IDL copies intarray into the temporary and adds 42 to the end of it.  Finally, it has to free the old intarray variable.  Creating a temporary variable is an expensive operation.  As such, you should always be mindful when operations will create temporary variables.  Take for example creating an integer array of fixed length with some initial value using array appending.

print, 'Creating array by appending'

tic

length=100000l

a=[]

for i=0l,length-1 do a=[a,42]

toc

Which completes in:

% Time elapsed: 1.4720001 seconds.

While the append functionality gives the flexibility to add an element to an array, the time to create the temporary makes this approach extremely impractical.  However, if we need a dynamic array which elements and be added and removed as needed, consider using LIST.

print, 'Creating array by list'

tic

length=100000l

l=list()

for i=0l, length-1 do l.add, 42

a=l.toarray()

toc

Which completes in:

% Time elapsed: 0.15200019 seconds.

LIST's avoid duplicating the entire array every time you add an element.  This is especially important when you are dealing with dynamic data.  However, if we know how long our array should be we can use IDL's array creation functions to drastically increase performance.

print, 'Creating array by preallocate'

tic

length=100000l

a=intarr(length,/nozero)

for i=0l, length-1 do a[i]=42

toc

Which completes in:

% Time elapsed: 0.0060000420 seconds.

In this case we can speed up our processing even more.  Since we are initializing each element of our array to the same value, we can improve our performance even more by using the MAKE_ARRAY function.

print, 'Creating array by vectorized solution'

tic

length=100000l

a=make_array(length,value=42)

toc

Which completes in:

% Time elapsed: 0.00000000 seconds.

There are many way to accomplish any given task in IDL.  However, each method has its unique advantages and disadvantages.  By understanding what you are trying to accomplish and what IDL has to do under the hood to perform an operation, you can dramatically decrease the time it takes your code to run.