2016-12-29 76 views
-2

在这个SO帖子里,https://softwareengineering.stackexchange.com/questions/304445/why-is-s-better-than-for-concatenation,据说%s比+好。但我的测试显示相反。对于字符串连接,%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 

好像他们几乎是相同的。我在这里错过了什么吗?

+1

我想像这种偏好是主要基于*可读性*而不是性能,这也取决于运行时间和其他因素。 – superuser0

+0

所有用户投票权下降。定时比较器功能始终与静态变量一起工作。 'y =“%s%s”%(y,random.choice(string.letters))'这是个玩笑? – dsgdfg

+0

另一点:'x + = random.choice(string.letters)'where is all index? – dsgdfg

回答

1

在你的情况下,字符串格式不是很有用,并且这两个变体都不是很好的python。连接列表的使用.join

def doit3(): 
    result = [] 
    for _ in range(R): 
     result.append(random.choice(string.letters)) 
    return ''.join(result) 
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) 
+0

一个更快的方式将是'''.join([random.choice(string.letters)for _ in range(R)])''。 BTW'string.letters'应该是'string.ascii_letters' for python 3吧? –

0

这不是性能,但“模板”%(参数),你有一个明确的国家环保总局的事“静态”内容(模板)和变量参数之间的比例。 根据您创建的字符串类型的不同,这会使事情变得更加可读(例如,您正在创建html/rest查询,路径在模板中清晰可见并且变量参数突出显示)

If在某些时候你需要本地化,很容易看到你只需要翻译模板部分,如果你正在创建html请求或sql查询或类似的东西,很显然你需要转义可变部分。

相关问题