由于Python的字符串不能更改,我想知道如何更有效地连接字符串?

我可以这样写:

s += stringfromelsewhere

或者像这样:

s = []

s.append(somestring)
    
# later
    
s = ''.join(s)

在写这个问题的时候,我发现了一篇关于这个话题的好文章。

http://www.skymind.com/~ocrow/python_string/

但它在Python 2.x中。,所以问题是Python 3中有什么变化吗?


当前回答

我的用例略有不同。我必须构造一个查询,其中超过20个字段是动态的。 我遵循了这种使用格式方法的方法

query = "insert into {0}({1},{2},{3}) values({4}, {5}, {6})"
query.format('users','name','age','dna','suzan',1010,'nda')

这对我来说相对简单,而不是使用+或其他方法

其他回答

如果要连接的字符串是字面量,则使用字符串字面量连接

re.compile(
        "[A-Za-z_]"       # letter or underscore
        "[A-Za-z0-9_]*"   # letter, digit or underscore
    )

如果你想对字符串的一部分进行注释(如上所述),或者如果你想对文本的一部分而不是全部使用原始字符串或三引号,这是非常有用的。

因为这发生在语法层,所以它使用零连接操作符。

将字符串附加到字符串变量的最好方法是使用+或+=。这是因为它可读性强,速度快。它们也一样快,你选择哪一种取决于你的口味,后者是最常见的。下面是timeit模块的计时:

a = a + b:
0.11338996887207031
a += b:
0.11040496826171875

然而,那些建议拥有列表并向列表中添加并加入这些列表的人,这样做是因为与扩展字符串相比,向列表中添加字符串可能非常快。在某些情况下,这可能是真的。例如,这里是一个 一个单字符字符串的百万次追加,首先是字符串,然后是列表:

a += b:
0.10780501365661621
a.append(b):
0.1123361587524414

事实证明,即使结果字符串有一百万个字符长,追加仍然更快。

现在让我们尝试将一个1000个字符的长字符串附加10万次:

a += b:
0.41823482513427734
a.append(b):
0.010656118392944336

因此,结束字符串的长度约为100MB。这是相当慢的,附加到一个列表要快得多。该计时不包括最后的a.join()。这需要多长时间?

a.join(a):
0.43739795684814453

牛津大学出版社。事实证明,即使在这种情况下,append/join也更慢。

那么这个建议从何而来呢?Python 2 ?

a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474

如果你使用的是非常长的字符串,那么append/join稍微快一点(通常情况下你不会,你会有一个100MB内存的字符串吗?)

但真正的关键是Python 2.3。我甚至不会给你们看计时,因为它太慢了,还没有完成。这些测试突然需要几分钟。除了append/join,它和后面的python一样快。

是的。在石器时代的Python中,字符串连接非常慢。但在2.4版不再是这样(至少Python 2.4.7),所以使用append/join的建议在2008年就过时了,那时Python 2.3停止更新,你应该停止使用它。: -)

(更新:当我更仔细地进行测试时,发现在Python 2.3上使用+和+=对两个字符串也更快。建议使用" .join()一定是一个误解)

然而,这是CPython。其他实现可能有其他问题。这就是为什么过早优化是万恶之源的另一个原因。不要使用被认为“更快”的技术,除非你先测量过它。

因此,进行字符串连接的“最佳”版本是使用+或+=。如果这对你来说很慢,这是不太可能的,那就做其他的事情。

为什么我在代码中使用了大量的追加/连接?因为有时候会更清楚。特别是当你要连接在一起的东西应该用空格、逗号或换行符分隔。

你可以用不同的方法来做。

str1 = "Hello"
str2 = "World"
str_list = ['Hello', 'World']
str_dict = {'str1': 'Hello', 'str2': 'World'}

# Concatenating With the + Operator
print(str1 + ' ' + str2)  # Hello World

# String Formatting with the % Operator
print("%s %s" % (str1, str2))  # Hello World

# String Formatting with the { } Operators with str.format()
print("{}{}".format(str1, str2))  # Hello World
print("{0}{1}".format(str1, str2))  # Hello World
print("{str1} {str2}".format(str1=str_dict['str1'], str2=str_dict['str2']))  # Hello World
print("{str1} {str2}".format(**str_dict))  # Hello World

# Going From a List to a String in Python With .join()
print(' '.join(str_list))  # Hello World

# Python f'strings --> 3.6 onwards
print(f"{str1} {str2}")  # Hello World

我通过以下文章创建了这个小摘要。

Python 3的f-Strings:改进的字符串格式化语法(指南)(还包括速度测试) 格式化字符串字面量 字符串连接和格式化 Python中的分割、连接和连接字符串

写出这个函数

def str_join(*args):
    return ''.join(map(str, args))

这样你就可以随时随地打电话了

str_join('Pine')  # Returns : Pine
str_join('Pine', 'apple')  # Returns : Pineapple
str_join('Pine', 'apple', 3)  # Returns : Pineapple3

我的用例略有不同。我必须构造一个查询,其中超过20个字段是动态的。 我遵循了这种使用格式方法的方法

query = "insert into {0}({1},{2},{3}) values({4}, {5}, {6})"
query.format('users','name','age','dna','suzan',1010,'nda')

这对我来说相对简单,而不是使用+或其他方法