Bal*_*m26 2 java performance n-gram
我知道这个名字有很多主题.我有一个生成ngrams的代码.但是想知道在处理数千个字符串时能否提高速度?
示例String ="abcdefghijkl1245ty789"
public static String[] ngrams(String s) {
int len=12;
String[] parts = s.split("(?!^)");
String[] result = new String[parts.length - len + 1];
for(int i = 0; i < parts.length - len + 1; i++) {
StringBuilder sb = new StringBuilder();
for(int k = 0; k < len; k++) {
sb.append(parts[i+k]);
}
result[i] = sb.toString();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码获取一个字符串,生成给定长度的ngrmas.在我的情况下它12.
当然:
public static String[] ngrams(String str, int length) {
char[] chars = str.toCharArray();
final int resultCount = chars.length - length + 1;
String[] result = new String[resultCount];
for (int i = 0; i < resultCount; i++) {
result[i] = new String(chars, i, length);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我做的改变:
String#toCharArray()是单个数组副本,因此速度更快StringBuilder,我使用了一个适当的String构造函数,它再次只做一个arraycopylength作为我的测试原因的参数.随意更改它 - 只需确保将方法重命名ngrams()为ngrams12()或等.或者完全放弃所有内容并使用一种天真的方法与String #substring()进行类似的工作:
public static String[] ngramsSubstring(String str, int length) {
final int resultCount = str.length() - length + 1;
String[] result = new String[resultCount];
for (int i = 0; i < resultCount; i++) {
result[i] = str.substring(i, i+length);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果您将来必须使用正则表达式,请尝试编译一次并重复使用它,而不是每次使用该方法时对其进行编译.例如,您的代码如下所示:
private static final Pattern EVERY_CHAR = Pattern.compile("(?!^)");
Run Code Online (Sandbox Code Playgroud)
然后,在方法中,而不是String#split,你使用
String[] parts = EVERY_CHAR.split(str);
Run Code Online (Sandbox Code Playgroud)