Python equivalent of Java StringBuffer?

后端 未结 8 1266
半阙折子戏
半阙折子戏 2020-12-04 21:10

Is there anything in Python like Java\'s StringBuffer? Since strings are immutable in Python too, editing them in loops would be inefficient.

相关标签:
8条回答
  • 2020-12-04 21:36

    In the top answer, the link from "Efficient String Concatenation in Python" no longer links to the intended page (redirects to tensorflow.org instead). However, this page from 2004 with the exact code cited probably represents that page https://waymoot.org/home/python_string/ .

    You may have seen it already since it comes up first if you google:

             efficient python StringBuilder
    

    I can't leave this in a comment, as I'm not privileged.

    0 讨论(0)
  • 2020-12-04 21:37

    I've added to Roee Gavirel's code 2 additional tests that show conclusively that joining lists into strings is not any faster than s += "something".

    Results:

    Python 2.7.15rc1    
    
    Iterations: 100000
    format    done in 0.317540168762s
    %s        done in 0.151262044907s
    list+join done in 0.0055148601532s
    str cat   done in 0.00391721725464s
    
    Python 3.6.7
    
    Iterations: 100000
    format    done in 0.35594654083251953s
    %s        done in 0.2868080139160156s
    list+join done in 0.005924701690673828s
    str cat   done in 0.0054128170013427734s
    f str     done in 0.12870001792907715s
    

    Code:

    from time import time
    
    
    def _with_cat(i):
        _st = ''
        for i in range(0, i):
            _st += "0"
        return _st
    
    
    def _with_f_str(i):
        _st = ''
        for i in range(0, i):
            _st = f"{_st}0"
        return _st
    
    
    def _with_format(i):
        _st = ''
        for i in range(0, i):
            _st = "{}{}".format(_st, "0")
        return _st
    
    
    def _with_s(i):
        _st = ''
        for i in range(0, i):
            _st = "%s%s" % (_st, "0")
        return _st
    
    
    def _with_list(i):
        l = []
        for i in range(0, i):
            l.append("0")
        return "".join(l)
    
    
    def _count_time(name, i, func):
        start = time()
        r = func(i)
        total = time() - start
        print("%s done in %ss" % (name, total))
        return r
    
    
    iteration_count = 100000
    
    print('Iterations: {}'.format(iteration_count))
    r1 = _count_time("format   ", iteration_count, _with_format)
    r2 = _count_time("%s       ", iteration_count, _with_s)
    r3 = _count_time("list+join", iteration_count, _with_list)
    r4 = _count_time("str cat  ", iteration_count, _with_cat)
    r5 = _count_time("f str    ", iteration_count, _with_f_str)
    
    if len(set([r1, r2, r3, r4, r5])) != 1:
        print("Not all results are the same!")
    
    0 讨论(0)
提交回复
热议问题