首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中的字符串连接与字符串替换

Python中的字符串连接与字符串替换
EN

Stack Overflow用户
提问于 2008-12-17 23:39:40
回答 5查看 84.1K关注 0票数 98

在Python中,使用字符串连接和字符串替换的地点和时间让我摸不着头脑。由于字符串连接在性能上有了很大的提升,这(变得更多)是一个风格上的决定,而不是一个实际的决定?

作为一个具体的例子,我们应该如何处理灵活URI的构造:

代码语言:javascript
复制
DOMAIN = 'http://stackoverflow.com'
QUESTIONS = '/questions'

def so_question_uri_sub(q_num):
    return "%s%s/%d" % (DOMAIN, QUESTIONS, q_num)

def so_question_uri_cat(q_num):
    return DOMAIN + QUESTIONS + '/' + str(q_num)

编辑:也有关于连接字符串列表和使用命名替换的建议。这些都是中心主题的变体,也就是说,在哪个时间,哪种方式是正确的?感谢您的回复!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-12-18 00:07:45

根据我的机器,连接速度(显着)更快。但在风格上,如果性能不重要,我愿意为替换付出代价。好吧,如果我需要格式化,甚至不需要问这个问题...除了使用插值/模板之外别无选择。

代码语言:javascript
复制
>>> import timeit
>>> def so_q_sub(n):
...  return "%s%s/%d" % (DOMAIN, QUESTIONS, n)
...
>>> so_q_sub(1000)
'http://stackoverflow.com/questions/1000'
>>> def so_q_cat(n):
...  return DOMAIN + QUESTIONS + '/' + str(n)
...
>>> so_q_cat(1000)
'http://stackoverflow.com/questions/1000'
>>> t1 = timeit.Timer('so_q_sub(1000)','from __main__ import so_q_sub')
>>> t2 = timeit.Timer('so_q_cat(1000)','from __main__ import so_q_cat')
>>> t1.timeit(number=10000000)
12.166618871951641
>>> t2.timeit(number=10000000)
5.7813972166853773
>>> t1.timeit(number=1)
1.103492206766532e-05
>>> t2.timeit(number=1)
8.5206360154188587e-06

>>> def so_q_tmp(n):
...  return "{d}{q}/{n}".format(d=DOMAIN,q=QUESTIONS,n=n)
...
>>> so_q_tmp(1000)
'http://stackoverflow.com/questions/1000'
>>> t3= timeit.Timer('so_q_tmp(1000)','from __main__ import so_q_tmp')
>>> t3.timeit(number=10000000)
14.564135316080637

>>> def so_q_join(n):
...  return ''.join([DOMAIN,QUESTIONS,'/',str(n)])
...
>>> so_q_join(1000)
'http://stackoverflow.com/questions/1000'
>>> t4= timeit.Timer('so_q_join(1000)','from __main__ import so_q_join')
>>> t4.timeit(number=10000000)
9.4431309007150048
票数 55
EN

Stack Overflow用户

发布于 2008-12-18 00:22:59

不要忘记命名替换:

代码语言:javascript
复制
def so_question_uri_namedsub(q_num):
    return "%(domain)s%(questions)s/%(q_num)d" % locals()
票数 24
EN

Stack Overflow用户

发布于 2013-05-13 11:27:36

出于好奇,我只是在测试不同字符串连接/替换方法的速度。在谷歌上搜索这个主题后,我就来到了这里。我想我会发布我的测试结果,希望它能帮助别人做出决定。

代码语言:javascript
复制
    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):
            # runs a single test for all functions in the 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):
            # runs multiple tests for all functions in the list
            for i in range(runs):
                    print "----------- TEST #" + str(i + 1)
                    dotimers(func_list)

在运行runtests((percent_, format_, format2_, concat_), runs=5)时,我发现在这些小字符串上,%方法的速度大约是其他方法的两倍。concat方法总是最慢的(勉强)。在format()方法中切换位置时有非常微小的差异,但切换位置总是比常规格式方法慢至少.01。

测试结果样本:

代码语言:javascript
复制
    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)和regular concat,其速度几乎是使用format%方法的3倍(1.1vs2.8)。我猜这取决于字符串,以及您试图实现的目标。如果性能真的很重要,尝试不同的东西并测试它们可能会更好。我倾向于选择可读性而不是速度,除非速度成为一个问题,但这只是我的问题。所以我不喜欢我的复制/粘贴,我不得不在所有东西上放8个空格来使它看起来正确。我通常用4。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/376461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档