我只是出于好奇测试不同的字符串拼接/替换方法的速度。在谷歌上搜索这个主题,我来到了这里。我想发布我的测试结果,希望能帮助某些人做出决定。
import timeit
def percent_():
return "test %s, with number %s" % (1,2)
def format_():
return "test {}, with number {}".format(1,2)
def format2_():
return "test {1}, with number {0}".format(2,1)
def concat_():
return "test " + str(1) + ", with number " + str(2)
def dotimers(func_list):
for func in func_list:
tmr = timeit.Timer(func)
res = tmr.timeit()
print "test " + func.func_name + ": " + str(res)
def runtests(func_list, runs=5):
for i in range(runs):
print "----------- TEST #" + str(i + 1)
dotimers(func_list)
在运行
runtests((percent_, format_, format2_, concat_), runs=5)
后,我发现在这些小字符串上,%方法的速度大约是其他方法的两倍。连接方法始终是最慢的(几乎可以忽略不计)。在
format()
方法中切换位置时可能会有微小的差异,但是切换位置总是比常规的format方法慢至少0.01秒。
测试结果示例:
test concat_() : 0.62 (0.61 to 0.63)
test format_() : 0.56 (consistently 0.56)
test format2_() : 0.58 (0.57 to 0.59)
test percent_() : 0.34 (0.33 to 0.35)
我运行了这些代码,因为我的脚本确实使用字符串拼接,我想知道它的成本是多少。我按不同的顺序运行它们,以确保没有任何干扰或者先后顺序对性能有更好的影响。顺便说一句,我在这些函数中添加了一些更长的字符串生成器,比如"%s" + ("a" * 1024)
,普通的连接方式几乎比使用format
和%
方法快3倍(1.1与2.8)。我想这取决于字符串和你要实现的目标。如果性能真的很重要,最好尝试不同的方法并进行测试。除非速度成为问题,否则我倾向于选择可读性而不是速度,但这只是我的个人观点。SO不喜欢我的复制/粘贴,我必须在每个地方放置8个空格才能使其看起来正确。我通常使用4个。
example.org(末尾没有斜杠) example.org/(斜杠) example.org:80/(斜杠+端口80)
是相同的URI但不是相同的字符串。 - karlcow