见鬼的 IDL 到底在干什么?创建变量
19886 给本文评分:
尚无评分
见鬼的 IDL 到底在干什么?创建变量
匿名 2014年9月25日,星期四
IDL 语言具有许多允许快速简单编程的特性。例如,假设你有一个 INT 数组,并且需要向其中追加一个值:
intarray = [intarray, **42**]
快速。简单。然而,仅仅因为你能这样做并不意味着你应该这样做。让我们来检查一下这个语句中发生了什么:
intarray = [intarray, **42**]
首先,IDL 必须创建一个临时数组来容纳 intarray 和新值。接着,IDL 将 intarray 复制到临时数组中,并将 42 添加到其末尾。最后,它必须释放旧的 intarray 变量。创建临时变量是一项开销很大的操作。因此,你应时刻注意哪些操作会创建临时变量。以使用数组追加的方式创建一个具有某个初始值的固定长度整数数组为例。
print, '通过追加方式创建数组'
tic
length=100000l
a=[]
for i=0l,length-1 do a=[a,42]
toc
完成时间:
% 耗时: 1.4720001 秒。
尽管追加功能提供了向数组添加元素的灵活性,但创建临时数组的时间使得这种方法极其不切实际。然而,如果我们需要一个动态数组,其元素可以根据需要添加和移除,请考虑使用 LIST。
print, '通过列表创建数组'
tic
length=100000l
l=list()
for i=0l, length-1 do l.add, 42
a=l.toarray()
toc
完成时间:
% 耗时: 0.15200019 秒。
LIST 避免了每次添加元素时复制整个数组。这在处理动态数据时尤其重要。然而,如果我们知道数组应该有多长,我们可以使用 IDL 的数组创建函数来大幅提升性能。
print, '通过预分配方式创建数组'
tic
length=100000l
a=intarr(length,/nozero)
for i=0l, length-1 do a[i]=42
toc
完成时间:
% 耗时: 0.0060000420 秒。
在这种情况下,我们可以进一步加快处理速度。由于我们将数组的每个元素初始化为相同的值,通过使用 MAKE_ARRAY 函数,我们可以进一步提高性能。
print, '通过向量化方案创建数组'
tic
length=100000l
a=make_array(length,value=42)
toc
完成时间:
% 耗时: 0.00000000 秒。
在 IDL 中,完成任何给定的任务都有许多方法。然而,每种方法都有其独特的优缺点。通过理解你想要完成的任务以及 IDL 在底层执行操作时必须做什么,你可以显著减少代码运行所需的时间。