文本处理 - 字符串拼接

做字符串拼接时,性能是不得不考虑的事情,字符串是不可变对象,任何对字符串的修改,包括字符串拼接都会创建一个新的字符串.如果拼接过程需要N步,那么就会产生N - 1个中间结果,这些结果都会占用内存.
1. 拼接的字符串邦定在变量上

使用'+'做字符串拼接:

1 largeString = small1 + small2 + 'something' + 'small3' + 'yet more'

实际上一共产生了4个字符串,分别是:

1 small1small2
2 small1small2'something'
3 small1small2'somethingsmall3'
4 small1small2'somethingsmall3yet more'

我们要的只是第四个而已.这种情况下推荐使用%来作拼接:

1 largeString = '%s%s%s%s' % (small1, small2, 'something', 'small3', 'yet more')

显而易见的在这种情况下字符串变量不会太多,否则哪得写多少了'+'或者%,这时性能问题也就可以忽略.之所以推荐使用%来作拼接是因为这种格式更清晰易懂,而且可以在拼接中直接加入字符串,甚至可以通过%s格式化非字符串,例如直接将数字通过%s拼接在字符串中.

1 >>> largeString = '%s not equal %d' % (99.0, 99)
2 >>> print largeString
3 99.0 not equal 99

2. 拼接字符串序列

 python中的序列严格上讲是一个可迭代的容器,可以从中取出一定数目的子项,也可一次取出一个,而且它还支持索引,切片,还可以传递给内建函数len.python的list就是序列,当然还有其它的序列,string, unicode,tuple,array.

 假设pieces是一个字符串序列,可以使用'+'进行拼接:

1 >>> largeString = ' '
2 >>> for piece in pieces:
3 ...     largeString += piece
4     

使用内建函数reduce:

1 >>> import operator
2 >>> reduce(operator.add, pieces, '')

reduce方法比第一个方法要漂亮一些,但根本上是一样,都是重载'+'操作符,所以都会产生中间结果。假设序列有N个子项,每个子项都由一个字符组成,那么第一个字符被拷贝了N次, 第二个字符被拷贝了N - 1次...最后一个被拷贝了1次,执行的拷贝总次数为1 + 2 + ... + n = 1/2n(n+1),所以时间复杂度为0(n2),也就是说这两种字符串拼接方法所需时间和拼接子项个数的平方成正比。许多需要做拼接的python程序性能低下的原因就是因为使用了'+'。这时候应该使用str的join方法:

1 >>> largeString = ' '.join(pieces)

join方法会获取pieces的第一个子项然后加上' '再获取第二个子项直到最后一个子项,每个子项只被拷贝一次,复杂度为O(n)。

3. 拼接的字符串不是一次性就位

如交互获取用户的输入或者字符串在程序运行时产生,这时候可以使用list将结果收集起来,然后调用join方法。

 

posted @ 2013-01-23 18:15  uzero  阅读(284)  评论(0编辑  收藏  举报