以下是提高Octave程序执行速度的其他一些方法。
a=零(1000);#创建1000x1000矩阵b=a;#此处未进行复制b(1)=1;#复制在此处完成
惰性复制适用于整个Octave对象,如矩阵、数组、结构体,以及单个数组或结构体元素(而不是数组)。
此外,当Octave能够确定索引部分在内存中是连续的时,索引表达式也使用延迟复制。例如
a=零(1000);#创建1000x1000矩阵b=a(:,10:100);#此处不复制b=a(10:100,:);#复制在此处完成
这适用于数组(矩阵)、元胞数组和索引的结构体()’. 在某些情况下,生成逗号分隔列表的索引表达式也可以从浅复制中受益。特别是,当a是astruct数组,表达式如下{a.x},{a(:,2).x}
将使用lazycoping,以便在结构体数组和元胞数组之间共享数据。
大多数索引表达式的生存时间都不会超过其父对象。然而,在极少数情况下,延迟复制的切片会比其父切片更持久,在这种情况下,它会成为孤儿,仍然占用不必要的内存。为了在大多数实际情况下提供补救措施,当avalue存储到“永久”位置(如命名变量orcell或struct元素)时,Octave会在某些情况下检查孤立的懒惰切片,并可能节约它们。例如
a=零(1000);#创建1000x1000矩阵b=a(:,10:100);#懒惰切片=[];#原始的“a”数组仍然被赋值c{1}=b;#b此时被重新赋值
result=零(big_n,big_m)for i=over:and _over ridx=。。。cidx=。。。result(ridx,cidx)=新值();外循环
而不是
结果对于i=ever:and_ever result=[result,new_value()];外循环
有时项目的数量无法提前计算,需要进行类似堆栈的操作。当元素被重复插入或从数组末尾移除时,Octave会将其检测为堆栈,并尝试通过将数组重新赋值到更大的块中来使用更智能的内存管理策略。此策略也适用于单元和结构体数组。
一而(条件)。。。a(end+1)=值;#“推送”操作。。。a(结束)=[];#“弹出”操作。。。循环结束
eval
或发烧
过度地。分析输入或在符号表中查找函数名称是相对昂贵的操作。如果您正在使用eval
仅仅作为一种异常处理机制,而不是因为需要执行一些任意文本,请使用尝试
语句。详见try语句.
ignore_function_time_stamp
在适当的时候。如果您正在调用许多函数,而在运行过程中没有一个函数需要更改,请设置变量ignore_function_time_stamp
到全部的
。这将阻止Octave在程序运行时检查函数文件的时间戳,以查看它是否已更新。版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-1