은 또한 사용할 수 있습니다.
속도가 느린 경우 우선 프로파일 러를 실행하여 병목 현상이 어디에 있는지 확인해야합니다. 그래야만 최적화해야합니다.
편집 : 그냥 '길이' 나이가 매트랩 버전 cellfun의 내장 함수로 사용했다고 회상했다. 그래서 실제로 빨라질 수도 있습니다!
cellfun('length',strings)
편집 (2)을보십시오 : 내 첫 번째 대답은 추측 것을 인정해야한다. @Rodin의 의견에 따라, 나는 속도 향상을 확인하기로 결정했다.
첫째, 문자열을 많이 생성하고 디스크에 저장하는 코드 : 그리고
function GenerateCellStrings()
strs = cell(1,10000);
for i=1:10000
strs{i} = GenerateRandomString();
end
save strs;
end
function st = GenerateRandomString()
MAX_STR_LENGTH = 1000;
n = randi(MAX_STR_LENGTH);
st = char(randi([97 122], 1,n));
end
, 벤치 마크 자체 :
function CheckRunTime()
load strs;
tic;
disp('Loop:');
for i=1:numel(strs)
n = length(strs{i});
end
toc;
disp('cellfun (String):');
tic;
cellfun('length',strs);
toc;
disp('cellfun (function handle):');
tic;
cellfun(@length,strs);
toc;
end
다음
는 벤치 마크의 코드
결과는 다음과 같습니다.
루프 :
경과 시간은 0.010663 초입니다.
cellfun (문자열) :
경과 시간은 0.000313 초입니다.
cellfun (함수 핸들) :
경과 시간은 0.006280 초입니다.
와우! '길이'구문은 루프보다 약 30 배 빠릅니다! 나는 그것이 왜 그렇게 빨리 될지 짐작할 수 있습니다. 어쩌면 그것이 length
을 특별히 인식한다는 사실 일 수도 있습니다. JIT 최적화가 될 수 있습니다.
편집 (3) - 속도 향상을 위해 the reason을 발견했습니다. 실제로 length
의 인식입니다. info에 @reve_etrange를 주셔서 감사합니다.
그 방법은 for 루프를 제거하고 엄청난 양의 문자열을 매우 빠르게 처리합니다. 고맙습니다! –
'cellfun ('length', strings)'(입력 인자가 충분하지 않다.)'cellfun ('@ length', strings)'에러가 발생한다. –
'cellfun' 구문은 iterator 변수와'strs {i}'의 상수 조회를 제거하기 때문에 for 루프보다 훨씬 빠르며 시스템을 완전히 망칠 것입니다. 그렇기 때문에 Matlab 코드의 벡터화가 중요한 이유입니다! –