因为Python的字符串
不能更改,我想知道如何更有效地连接字符串?
我可以这样写:
s += stringfromelsewhere
或者像这样:
s = []
s.append(somestring)
# later
s = ''.join(s)
在写这个问题的时候,我发现了一篇谈论这个话题的好文章。
http://www.skymind.com/~ocrow/python_string/
但是它是在Python2.x中,所以问题是Python3中是否做了一些更改?
在Python
>>> name = 'some_name'
>>> number = 123
>>>
>>> f'Name is {name} and the number is {number}.'
'Name is some_name and the number is 123.'
如果你连接了很多值,那么两者都不是。追加列表是昂贵的。您可以使用StringIO。尤其是当你在大量的操作中建立它的时候。
from cStringIO import StringIO
# python3: from io import StringIO
buf = StringIO()
buf.write('foo')
buf.write('foo')
buf.write('foo')
buf.getvalue()
# 'foofoofoo'
如果您已经从其他操作返回了一个完整的列表,那么只需使用"。加入(aList)
来自python常见问题解答:将许多字符串连接在一起的最有效方法是什么?
str和bytes对象是不可变的,因此将许多字符串连接在一起效率很低,因为每次连接都会创建一个新对象。在一般情况下,总运行时成本是字符串总长度的二次方。
要积累许多str对象,推荐的习惯用法是将它们放入列表中,并在末尾调用str.join()
chunks = []
for s in my_strings:
chunks.append(s)
result = ''.join(chunks)
(另一个相当有效的习惯用法是使用io.StringIO)
要累积多个字节对象,推荐的惯用法是使用就地连接(=运算符)扩展bytearray对象:
result = bytearray()
for b in my_bytes_objects:
result += b
编辑:我很傻,把结果向后粘贴,让它看起来像附加到列表比cStringIO更快。我还添加了bytearray/str conc at的测试,以及使用更大字符串的更大列表的第二轮测试。(python 2.7.3)
大型字符串列表的ipython测试示例
try:
from cStringIO import StringIO
except:
from io import StringIO
source = ['foo']*1000
%%timeit buf = StringIO()
for i in source:
buf.write(i)
final = buf.getvalue()
# 1000 loops, best of 3: 1.27 ms per loop
%%timeit out = []
for i in source:
out.append(i)
final = ''.join(out)
# 1000 loops, best of 3: 9.89 ms per loop
%%timeit out = bytearray()
for i in source:
out += i
# 10000 loops, best of 3: 98.5 µs per loop
%%timeit out = ""
for i in source:
out += i
# 10000 loops, best of 3: 161 µs per loop
## Repeat the tests with a larger list, containing
## strings that are bigger than the small string caching
## done by the Python
source = ['foo']*1000
# cStringIO
# 10 loops, best of 3: 19.2 ms per loop
# list append and join
# 100 loops, best of 3: 144 ms per loop
# bytearray() +=
# 100 loops, best of 3: 3.8 ms per loop
# str() +=
# 100 loops, best of 3: 5.11 ms per loop
将字符串附加到字符串变量的最佳方法是使用或
=
。这是因为它的可读性和快速。它们也一样快,你选择哪一个是口味问题,后一个是最常见的。下面是timeit
模块的计时:
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
但是,那些建议创建列表并附加到列表中,然后加入这些列表的人这样做是因为将字符串附加到列表中可能比扩展字符串快得多。在某些情况下,这可能是真的。例如,这里是一个字符串的一百万个附录,首先是字符串,然后是列表:
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
好的,即使结果字符串有一百万个字符长,追加速度也更快。
现在,让我们尝试将1000个字符长的字符串追加十万次:
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
因此,结束字符串最终约为100MB长。这是相当慢的,附加到列表快得多。该时间不包括最终的a.join()
。那要花多长时间?
a.join(a):
0.43739795684814453
分组。事实证明,即使在这种情况下,append/join速度也较慢。
那么这个推荐从何而来呢?蟒蛇2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
嗯,如果您使用非常长的字符串(通常不是,那么内存中有一个100MB的字符串会是什么?)
但真正的关键是Python 2.3。我甚至不会告诉你时间,因为它太慢了,还没有结束。这些测试突然需要几分钟。除了append/join,它的速度和后面的python一样快。
是的。在石器时代的Python中,字符串串联非常缓慢。但是在2.4版本中,它不再是了(或者至少是Python 2.4.7),所以使用append/连接的建议在2008年变得过时了,当时Python 2.3停止更新,你应该停止使用它。:-)
(更新:当我更仔细地进行测试时,发现在Python 2.3上使用和
=
对两个字符串也更快。推荐使用"。加入()
一定是误解)
然而,这是CPython。其他实现可能具有其他关注。这只是过早优化是万恶之源的另一个原因。不要使用一种应该“更快”的技术,除非你先测量它。
因此,进行字符串连接的"最佳"版本是使用or=。如果这对你来说是缓慢的,这是不太可能的,那就做点别的。
那么为什么我要在代码中使用大量的append/join呢?因为有时候它实际上更清晰。特别是当您应该连接在一起的内容应该用空格、逗号或换行符分隔时。
问题内容: 由于无法更改,因此我想知道如何更有效地连接字符串? 我可以这样写: 或像这样: 问题答案: 将字符串附加到字符串变量的最佳方法是使用+或+=。这是因为它可读且快速。它们的速度也一样快,你选择的是一个品味问题,后者是最常见的。以下是该timeit模块的计时: 但是,那些建议拥有列表并附加到列表然后再连接这些列表的人之所以这样做,是因为与扩展字符串相比,将字符串附加到列表可能非常快。在某些
本文向大家介绍python字符串连接方式汇总,包括了python字符串连接方式汇总的使用技巧和注意事项,需要的朋友参考一下 在python中有很多字符串连接方式,今天就在这里具体总结一下: ①.最原始的字符串连接方式:str1 + str2 ②.python 新字符串连接语法:str1, str2 ③.奇怪的字符串方式:str1 str2 ④.% 连接字符串:‘name:%s; sex: ' %
我们有一个用空格分隔的数字或单词的长字符串。我们需要获取它们的流。首选方法是什么? 我知道两个选择: 数组(str.split(“”).stream(); 新扫描仪(str)。代币() 两者都返回字符串流。哪个选项更好? 还有其他方法吗?
问题内容: 我想使用php / pdo制作一个后端应用程序。我发现了很多不同的方法来进行PDO连接字符串。我想知道,使用pdo做连接字符串的最佳方法是什么。这是做连接字符串的最佳方法还是我应该使用其他一些代码。欢迎任何建议或调整! 这是我目前所拥有的: 问题答案: 这个问题并不像看起来那么容易。我写了一个规范的示例, 如何使用PDO连接到MySQL 。 因此,让我们看一下可以改进的地方: 可以将c
我有一些字符串要连接,结果字符串会很长。我还有一些要连接的变量。 如何组合字符串和变量,使结果成为多行字符串? 以下代码抛出错误。 这个我也试过 请建议一种方法。
问题内容: 在Python中是什么意思?下面的代码有什么作用? 例如… 问题答案: 这是一种字符串格式语法(它是从C借用的)。 请参阅“ PyFormat”: Python支持将值格式化为字符串。尽管这可能包含非常复杂的表达式,但最基本的用法是使用占位符将值插入字符串。 编辑: 这是一个非常简单的示例: 该令牌允许我插入(和潜在的格式)的字符串。请注意,令牌被替换为符号后传递给字符串的任何内容。还