这些String操作在Java和Python中是否相同?

时间:2014-03-21 07:27:14

标签: java python string performance replace

考虑以下两个代码块, 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);

http://ideone.com/v8wg6m

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版本慢?

2 个答案:

答案 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))