2013年3月1日 星期五

在 python 中較快的字串加法

在 python、java 中,字串都是不可變的(immutable)。意味著,字串被建立後就不能夠被修改。因此,當你在做 n 個字串加法時,它會產生 n - 2 個暫時字串物件。 為了避免在做大量字串加法時,產生過多的暫時物件。 java 中有 stringbuffer 可以使用。用法如下:




public class TestStr{
    public static void main(String[] args){
        StringBuffer buf = new StringBuffer();
        int i;
        for(i = 0; i < 100; i++){
            buf.append("s");
        }
        String result = buf.toString();
        System.out.println(result);
    }
}

那在 python 中呢? python 中雖然無類似 StringBuffer 的物件,但是你可以使用 list 來代替。像這樣。


buf = []
for i in xrange(100):
    buf.append('s')
ret = ''.join(buf)
print ret

先把要做相加的字串都先存到 list 裡,最後再用字串的join方法將它們合併成一個字串。這樣做可以減少不必要的物件產生,也可以加快速度( gc 要回收的物件少很多)

事實上,stringIO也可以做到類似的事情。只是我覺得用 list 就差不多了。 使用stringIO的例子如下


import StringIO

buf = StringIO.StringIO()
for i in xrange(100):
    buf.write('s')

ret = buf.getvalue()
buf.close()
print ret

1 則留言:

  1. 這2個語言我都會一些(Python喜歡多些),我從來沒考慮到由於程式產生過多的暫時性物件,而導致gc的忙碌。這文章讓我學到東西,謝謝 :-)

    回覆刪除