Python的字符串连接与str.join的速度有多慢?

Python的字符串连接与str.join的速度有多慢?

我想知道+=运营商和运营商之间的速度差异''.join()

那两者之间的速度比较是什么?


芜湖不芜
浏览 872回答 3
3回答

大话西游666

来自:高效字符串连接方法1:def method1():   out_str = ''   for num in xrange(loop_count):     out_str += 'num'   return out_str方法4:def method4():   str_list = []   for num in xrange(loop_count):     str_list.append('num')   return ''.join(str_list)现在我意识到它们并不具有严格的代表性,并且第四种方法在迭代并加入每个项目之前附加到列表中,但这是一个公平的指示。字符串连接比串联快得多。为什么?字符串是不可变的,不能在适当的位置进行更改。要改变一个,需要创建一个新的表示(两者的串联)。

沧海一幻觉

我的原始代码是错误的,似乎+连接通常更快(特别是在较新的硬件上使用较新版本的Python)时间如下:Iterations: 1,000,000Windows 7,Core i7上的Python 3.3String of len:   1 took:     0.5710     0.2880 secondsString of len:   4 took:     0.9480     0.5830 secondsString of len:   6 took:     1.2770     0.8130 secondsString of len:  12 took:     2.0610     1.5930 secondsString of len:  80 took:    10.5140    37.8590 secondsString of len: 222 took:    27.3400   134.7440 secondsString of len: 443 took:    52.9640   170.6440 secondsWindows 7,Core i7上的Python 2.7String of len:   1 took:     0.7190     0.4960 secondsString of len:   4 took:     1.0660     0.6920 secondsString of len:   6 took:     1.3300     0.8560 secondsString of len:  12 took:     1.9980     1.5330 secondsString of len:  80 took:     9.0520    25.7190 secondsString of len: 222 took:    23.1620    71.3620 secondsString of len: 443 took:    44.3620   117.1510 seconds在Linux Mint上,Python 2.7,一些较慢的处理器String of len:   1 took:     1.8840     1.2990 secondsString of len:   4 took:     2.8394     1.9663 secondsString of len:   6 took:     3.5177     2.4162 secondsString of len:  12 took:     5.5456     4.1695 secondsString of len:  80 took:    27.8813    19.2180 secondsString of len: 222 took:    69.5679    55.7790 secondsString of len: 443 took:   135.6101   153.8212 seconds以下是代码:from __future__ import print_functionimport timedef strcat(string):     newstr = ''     for char in string:         newstr += char    return newstrdef listcat(string):     chars = []     for char in string:         chars.append(char)     return ''.join(chars)def test(fn, times, *args):     start = time.time()     for x in range(times):         fn(*args)     return "{:>10.4f}".format(time.time() - start)def testall():     strings = ['a', 'long', 'longer', 'a bit longer',                 '''adjkrsn widn fskejwoskemwkoskdfisdfasdfjiz  oijewf sdkjjka dsf sdk siasjk dfwijs''',                '''this is a really long string that's so long                it had to be triple quoted  and contains lots of                superflous characters for kicks and gigles                @!#(*_#)(*$(*!#@&)(*E\xc4\x32\xff\x92\x23\xDF\xDFk^%#$!)%#^(*#''',               '''I needed another long string but this one won't have any new lines or crazy characters in it, I'm just going to type normal characters that I would usually write blah blah blah blah this is some more text hey cool what's crazy is that it looks that the str += is really close to the O(n^2) worst case performance, but it looks more like the other method increases in a perhaps linear scale? I don't know but I think this is enough text I hope.''']     for string in strings:         print("String of len:", len(string), "took:", test(listcat, 1000000, string), test(strcat, 1000000, string), "seconds")testall()

阿波罗的战车

现有的答案写得非常好,研究得很好,但这是Python 3.6时代的另一个答案,因为现在我们有文字字符串插值(AKA,f-strings):>>> import timeit>>> timeit.timeit('f\'{"a"}{"b"}{"c"}\'', number=1000000)0.14618930302094668>>> timeit.timeit('"".join(["a", "b", "c"])', number=1000000)0.23334730707574636>>> timeit.timeit('a = "a"; a += "b"; a += "c"', number=1000000)0.14985873899422586使用CPython 3.6.5在2012年Retina MacBook Pro上进行测试,其中Intel Core i7为2.3 GHz。这绝不是任何正式的基准测试,但看起来使用f-strings与使用+=连接一样高效; 当然,任何改进的指标或建议都是受欢迎的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python