在这篇SO帖子https://softwareengineering.stackexchange.com/questions/304445/why-is-s-better-than-for-concatenation中,据说%s优于+。但是我的测试结果恰恰相反。
import string
import random
R = 10
def doit1():
x =""
for _ in range(R):
x += random.choice(string.letters)
def doit2():
y = ""
for _ in range(R):
y = "%s%s" % (y, random.choice(string.letters))
if __name__ == '__main__':
import timeit
print(timeit.timeit("doit1()", setup="from __main__ import doit1"))
print(timeit.timeit("doit2()", setup="from __main__ import doit2"))
给我以下输出:
➜ Documents python3.5 string_test.py
30.200247984997986
33.85921495900038
似乎它们几乎是一样的。我在这里错过了什么吗?
答案 0 :(得分:2)
答案 1 :(得分:1)
在你的情况下,字符串格式化不是很有用,并且两种变体都不是很好的python。对于列表连接,请使用.join
:
def doit3():
result = []
for _ in range(R):
result.append(random.choice(string.letters))
return ''.join(result)
答案 2 :(得分:0)
连接比格式化更快,但它的可维护性和可读性较差。 我发现了一个类似的问题: Python string formatting: % vs concatenation
答案 3 :(得分:0)
您应该使用对当前任务最有意义的方法。对于给定的示例,那将是str.join
:
def doit3():
''.join(random.choice(string.letters) for _ in range(R))
如果你有一个简单的操作,连接可能会很好:
dt = '20160108'
tm = '135623'
combined = dt+tm
如果要将变量添加到现有字符串中,请使用插值(或str.format
,或格式化字符串文字,或其他):
dt = '20160108'
tm = '135623'
result = 'The date is %s and the time is %s.' % (dt, tm)
答案 4 :(得分:0)
这不是表演的问题,而是"模板" %(参数)你明确区分"静态"内容(模板)和变量参数。 根据您创建的字符串类型,这使得事情更具可读性(比如您正在创建html / rest查询,模板中的路径清晰可见,并且突出显示变量参数)
如果在某些时候您需要本地化,很容易看到您只需要翻译模板部分,如果您正在创建HTML请求或SQL查询等,那么它很清楚你需要逃避变量部分。