考虑以下两个代码块, http://ideone.com/3nNdVs
String[] matches = new String[] {"Foo", "Bar"};
long start = System.nanoTime();
for(int i=0; i< 1000000; i++) {
String name = "This String is Foo Bar";
for (String s : matches){
name = name.replace(s, "");
}
}
System.out.println((System.nanoTime() - start)/1000000);
matches = {"Foo", "Bar"}
start = time.time()
for x in xrange(1000000):
name = "This String is Foo Bar"
for s in matches:
name = name.replace(s, "")
print time.time() - start
在尝试对这两者的性能进行基准测试时,我发现用Java实现的那个比Python长大约50%。这对我来说非常震撼,因为我期待Python版本更慢。
所以第一个问题是,是否有更好或更快的方法来执行这两个功能?
其次,如果没有,为什么Java版本比Python版本慢?
答案 0 :(得分:2)
我发现了python更快的原因,这是因为java中的.replace方法使用的是每次调用.replace时编译的正则表达式。
有许多更快的替代品,但我发现最方便的是使用org.apache.commons.lang3.StringUtils库的.replaceEach,它使用index来查找和替换我理解的子串仍然比一次编译的正则表达式更快。
long start = System.nanoTime();
for(int i=0; i< 1000000; i++) {
String name = "This String is Foo Bar";
name = StringUtils.replaceEach(name, matches, replaces);
}
System.out.println((System.nanoTime() - start)/1000000);
不幸的是,我可以提供一个关于ide的链接,因为他们没有apache公共。
我系统上的这个算法版本比.replace方法快1/4,比python快约1/2。
如果有人有更快的python选项让我知道
感谢
答案 1 :(得分:-1)
对于Python,请使用timeit模块:
import timeit
setup = """
matches = {'Foo', 'Bar'}
for x in xrange(1000000):
name = 'This String is Foo Bar'
for s in matches:
name = name.replace(s, '')
"""
print min(timeit.Timer(setup=setup).repeat(10))