0

我的一个答案最近因建议使用cd(path_to_toolbox) 而不是其中一种path工具(例如addpathor )而被否决rmpath。鉴于我收到的强烈批评,我必须想象使用这些工具有很好的理由path,大概它们在某种程度上更健壮,尤其是当代码分发到其他系统时。

然后我决定记录cdvs的表现,addpath惊讶地发现以下结果。在每次试验之前,我清除了工作区并创建了一个带有交替路径的字符串数组:

clear
clc

p1 = 'c:\MATLAB7\toolbox\symbolic\@sym\';
p2 = matlabroot;

newpath = repmat(' ',100,100);

for ii=1:2:99
    newpath(ii,1:length(p1)) = p1;    
    newpath(ii+1,1:length(p2)) = p2;    
end

然后我运行或者addpath如下cd

tic
for ii=1:100
    addpath(newpath(ii,:))
end
toc

经过的时间是 13.437000 秒。

tic
for ii=1:100
    cd(newpath(ii,:))
end
toc

经过的时间是 1.078000 秒。

任何关于是否存在cd可以证明使用的条件的评论,例如设置函数的路径(工具箱或其他),都值得赞赏。虽然它可能被认为是草率的,但我已经使用cd了很多年,虽然如果反复使用减速可能会很明显,但我发现如果它不在程序的高度迭代部分中使用,减速是值得的,它为编码带来的简单性。值得注意的是,addpath使用起来并不复杂,但现在我似乎有一个真正的理由更喜欢cd它:它实际上更快。

编辑

作为这篇文章的附言,我恳求我不正当使用cd(在这个例子中,addpath)。然而,在一种经常用于快速而肮脏的脚本编写的语言中,应该有这样的使用空间。应该记住,matlab 用户的专业知识是有等级的,在某些情况下,不那么“高级”和看似草率的编程技术实际上可以被解释为在短期内是有利的(如果不是长期的话,或版本和目录结构管理可能会出现问题的地方)。

作为附录,我包含了一些指向 SO 上的帖子的链接以及超出该地址的内置函数覆盖、阴影等,其中addpath(我也会争论cd)可以使用:

如何取消隐藏覆盖的功能?

如何获取覆盖的内置函数的句​​柄?

如何用同名的新函数包装已经存在的函数

http://www.mathworks.in/matlabcentral/newsreader/view_thread/264354

4

2 回答 2

3

显然,path随着时间变长,MATLAB 必须搜索更多位置来查找函数、脚本、类等。所以我想如果你有很长的时间,它会对性能产生负面影响path

另一方面,当前目录只是一个必须搜索的位置(当然要考虑优先顺序)。

另外,比较两者是不公平的,除非您可以将所有文件放在一个文件夹中。


只是关于您的编码风格的说明:您可以使用字符串的单元阵列而不是字符矩阵来存储newpath

newpath = cell(100,1);
for i=1:100
    newpath{i} = '...';
end
于 2013-08-17T22:52:30.747 回答
1

我认为,如果您使用cd这样的方式在路径中添加一些东西,应该避免大多数缺点:

function addpathwithcd(pathToAdd)
currentPath = pwd;
cd(pathToAdd);
cd(currentPath);

但是,在做了一个(非常小的)测试之后,这对我来说似乎并不比简单地使用addpath(pathToAdd).

实际上,这对我来说有点意外,因为您记录了 13 倍的速度差异,而我只使用了两次 CD,因此我预计会有 6 倍左右的速度差异。

于 2013-08-19T09:32:13.490 回答