对于字符串连接,%s是否真的比+更好?

时间:2016-12-29 09:48:10

标签: python string

在这篇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
似乎它们几乎是一样的。我在这里错过了什么吗?

5 个答案:

答案 0 :(得分:2)

对于3.6 f-string 要快得多:

enter image description here (格式化所需时间越少越好)

来源和详情:https://cito.github.io/blog/f-strings/

答案 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查询等,那么它很清楚你需要逃避变量部分。