Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matlab中高效的字符串拼接_Python_String_Matlab_String Concatenation - Fatal编程技术网

Python Matlab中高效的字符串拼接

Python Matlab中高效的字符串拼接,python,string,matlab,string-concatenation,Python,String,Matlab,String Concatenation,不久前我偶然发现了这一点。它评估python中几种连接方法的性能。以下是比较的6种方法中的4种: Python字符串连接方法 方法1:简单附加 方法4:建立一个字符串列表,然后加入它 方法5:写入伪文件 方法6:列表理解 结果得出的结论如下: 我会在大多数实际程序中使用方法6。它很快,也很容易理解。它确实要求您能够编写一个表达式来返回要追加的每个值。有时这样做并不方便——例如,当有几个不同的代码块正在生成输出时。在这些情况下,您可以选择方法4和方法5 读了这篇文章后,我意识到我不知道方法5和6。

不久前我偶然发现了这一点。它评估python中几种连接方法的性能。以下是比较的6种方法中的4种:

Python字符串连接方法 方法1:简单附加 方法4:建立一个字符串列表,然后加入它 方法5:写入伪文件 方法6:列表理解 结果得出的结论如下:

我会在大多数实际程序中使用方法6。它很快,也很容易理解。它确实要求您能够编写一个表达式来返回要追加的每个值。有时这样做并不方便——例如,当有几个不同的代码块正在生成输出时。在这些情况下,您可以选择方法4和方法5

读了这篇文章后,我意识到我不知道方法5和6。在大多数情况下,我现在更喜欢使用方法5,因为它允许我以与写入文件相同的方式写入字符串

我的问题是,在matlab中,字符串连接的不同技术是什么?我很少在matlab中处理字符串,但我遇到了一个需要我编写字符串的问题。我想到的一个解决方案是写入一个临时文件,并在完成后读取该文件。但在做这件事之前,我决定问问,看看是否有更好的选择。目前,在matlab中有一种简单的附加方法:

%What you will typically find in sample code
loop_count=1e4
out_str = [];
tic
for num=1:loop_count
    out_str = [out_str num]; %#ok<AGROW>
end
toc

% What typically runs faster
out_str = [];
tic
for num=1:loop_count
    out_str(end+1) = num; 
end
toc
Matlab字符串连接方法 方法1:简单附加 这是一个简单的测试:

>> tic; tmp1 = method1(100000); toc
Elapsed time is 13.144053 seconds.
>> tic; tmp2 = method2(100000); toc
Elapsed time is 2.358082 seconds.

由于Matlab更喜欢对数组执行矢量化操作,并且在使用for循环时效率很低,因此最好的通用解决方案是使用所有字符串创建一个单元格数组,并根据需要使用
[str_array{:}]
组合它们,或者使用
strjoin
sprintf
(见下文)进行连接

对于某些操作,如从数字数组创建逗号分隔字符串,有更有效的解决方案,如

numeric_array = rand(1 ,100000);
out_str = sprintf('%d,', numeric_array);
out_str = out_str(1:end-1);
因为它同时执行字符串转换和连接


作为旁注,
out_str=sprintf(“%s”,str_数组{:});out_str=out_str(1:end-1)
的速度大约是使用Matlab2013a在我的计算机上运行的strjoin(str_array{:})的十倍。

一般来说,有一种快速的方法来增长向量串联,但这并不是经常提到的。这是一个明确的示例(串联数字,但在matlab中字符也被视为数字):


当然,如果您在开始之前已经知道要连接的所有内容,那么游戏就会改变。假设要将数字的字符串表示形式连接到向量中:

%Vectorized code typically runs fastest
v =1:loop_count
M=[num2str(v)];
tic
M=M(~M==' ');
toc
将给予

Elapsed time is 0.077540 seconds.
Elapsed time is 0.004776 seconds.
Elapsed time is 0.001903 seconds.

由于使用了
num2str
,您对
method1
的实现可能会遇到很多问题,请尝试改用
sprintf('%d',num)
。将数字到字符串的转换与字符串连接分开是个好主意,以获得更可靠的结果。@erikced,我在编辑后注意到了这一点。如果我使用
sprintf
,结果发现method1比method2快。我认为对于一般目的来说,最快的方法是简单的方法,然后您只需将其附加到字符串中。对于我正在处理的问题,我将创建一个字符串,不仅仅是数字,还有一些其他内容。现在,我必须选择,我将所有信息存储在单元格中的字符串中,然后将其更改为字符串,或者在执行时将所有内容附加到单个字符串中。@jmlopez如果您只逐个获取值,我确实怀疑中间存储是否能获得任何东西,而且很可能不会获得太多。还有一件事要考虑的是,弦是不是一个接一个地获得。如果没有,可能会有一些性能提升的空间。
>> tic; tmp1 = method1(100000); toc
Elapsed time is 13.144053 seconds.
>> tic; tmp2 = method2(100000); toc
Elapsed time is 2.358082 seconds.
numeric_array = rand(1 ,100000);
out_str = sprintf('%d,', numeric_array);
out_str = out_str(1:end-1);
%What you will typically find in sample code
loop_count=1e4
out_str = [];
tic
for num=1:loop_count
    out_str = [out_str num]; %#ok<AGROW>
end
toc

% What typically runs faster
out_str = [];
tic
for num=1:loop_count
    out_str(end+1) = num; 
end
toc
Elapsed time is 0.077540 seconds.
Elapsed time is 0.004776 seconds.
%Vectorized code typically runs fastest
v =1:loop_count
M=[num2str(v)];
tic
M=M(~M==' ');
toc
Elapsed time is 0.001903 seconds.