网上很多文章人云亦云,字符串连接应该使用「join」方法而不要用「+」操作。说前者效率更高,它以更少的代价创建新字符串,如果用「+」连接多个字符串,每连接一次,就要为字符串分配一次内存,效率显得有点低,这样的解释听起来很有道理,但 Cpython 解释器是不是真的按照我们说的这样呢?
今天做了一个试验,结果可能会出乎你的意料。
defjoin(n):
s = "".join((str(i) fori inrange(n)))
defformat(n):
( "{}"* n).format(*(i fori inrange(n)))
defplus(n):
s = ""
fori inrange(n):
s += str(i)
上面 3 个函数分别表示用「join」和「format」还有「+」操作来连接字符串,从 0 到 n,总共 n 个数字连接起来构成一个新的字符串,形如:1234567891011……n。
下面是测试脚本:
每组取了15个样本数据,分别用 1,2,4,8,… 8192 个数字相连接,得到的统计数据可以看出,在数据量非常少的时候,三者效率几乎没什么差异,当少于20个字符串连接时,用「+」效率甚至更高,不过,随着字符串的个数增多,「join」方法发挥出来效果了,而用「+」越来越慢。这点无论是 python2 还是 python3 基本上是一样的。
python2.7.10
python3.6.0
所以结论是:如果连接的字符串很少,只有几个或者十几个,完全可以通过「+」来连接,毕竟这种方式更直白,而超过一定个数之后,则应该采用「join」方法,只有在操作大数据的时候,两者的对比才明显。
通过现象看本质才能做到知其然并知其所以然。Cpython 编译器内部其实针对字符串做了非常多的优化工作。在下篇文章准备专门写一写字符串工作原理的文章,这里先买个瓜子,预知后事如何,请关注「Python之禅」
最后,做任何事我们都不能仅凭三言两语就听信于人,而应该带着质疑的精神去探索这个世界。(有感于最近一程序员因求职被卷入传销组织遇难)
原文地址:https://www.cnblogs.com/ExMan/p/10374617.html