Date

资深一点的python开发者肯定知道如果要把很多小的字符串拼接起来,用''.join的方式效率最高。

最近遇到一个字符串拼接的问题,比较有意思,记录一下。

场景是,在开发thrift序列化库的时候,产生了一个字符串类型的链表,最终要把链表中的字符串拼接成一个整串,并在前面加上整个字符串的长度。

最原始的实现是:

def list_join_and_concat(_list):
    msg = ''.join(_list)
    return pack('!i', len(msg)) + msg

写的过程中发现这里有个字符串相加的操作,而且msg这个字符串对象比较大,担心对效率有影响,因此思考一下是否有别的实现方案。

为了消除字符串相加,想了两个方案:

def list_insert_join(_list):
    length = sum(map(len, _list))
    _list.insert(0, pack('!i', length))
    return ''.join(_list)

这是第一个改进方案,感觉代码不是很好看,而且查了一下insert(0,x)应该是个O(n)的操作。

突然想到itertools这个库,然后改进一下变成这样:

def chain_join(_list):
    length = sum(map(len, _list))
    return ''.join(chain([pack('!i', length)], _list))

感觉这个方案的代码还是比较优雅的。

那么继续测试一下效率,结果如下:

In [1]: %timeit list_join_and_concat(LONG_STR_LIST)
1000 loops, best of 3: 1.61 ms per loop

In [2]: %timeit chain_join(LONG_STR_LIST)
100 loops, best of 3: 9.02 ms per loop

In [3]: %timeit list_insert_join(LONG_STR_LIST)
100 loops, best of 3: 6.95 ms per loop

结果发现还是原来第一个方案效率最高。