Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么要将字符串与'';。加入(名单)这么受欢迎?_Python_String_Python 2.7_List_Python 3.x - Fatal编程技术网

Python 为什么要将字符串与'';。加入(名单)这么受欢迎?

Python 为什么要将字符串与'';。加入(名单)这么受欢迎?,python,string,python-2.7,list,python-3.x,Python,String,Python 2.7,List,Python 3.x,我知道,”.join(list)是连接字符串的首选方法,而不是说: for x in list: s += x 我的问题是为什么这要快得多 另外,如果我需要连接列表中尚未包含的项目,该怎么办?仅仅为了执行“”。加入(列表),就把它们放在列表中会更快吗 编辑:这与前面链接的问题不同,因为我特别想知道这些项目是否已经不在列表中,出于性能原因,是否仍然建议将它们放在列表中,以便仅用于加入。这会更快,因为加入方法可以使用“在表面之下”,并使用Python层不可用的低级优化。循环必须通过序列生成

我知道,
”.join(list)
是连接字符串的首选方法,而不是说:

for x in list:
    s += x
我的问题是为什么这要快得多

另外,如果我需要连接列表中尚未包含的项目,该怎么办?仅仅为了执行
“”。加入(列表)
,就把它们放在列表中会更快吗


编辑:这与前面链接的问题不同,因为我特别想知道这些项目是否已经不在列表中,出于性能原因,是否仍然建议将它们放在列表中,以便仅用于加入。

这会更快,因为
加入
方法可以使用“在表面之下”,并使用Python层不可用的低级优化。循环必须通过序列生成器,依次处理每个对象。此外,您的循环必须在每次迭代中构建一个新字符串,这是一个缓慢的过程。
join
可以在C层或更低层上使用可变字符串


如果对象不在列表中…这取决于应用程序。但是,我怀疑几乎任何这样的应用程序都必须在某个地方通过循环开销才能形成列表,因此您将失去加入的一些优势,尽管可变字符串仍然可以节省时间。

这会更快,因为
join
方法可以潜到水面下“并使用Python层无法提供的较低级别优化。循环必须通过序列生成器,依次处理每个对象。此外,循环必须在每次迭代中构建一个新字符串,这是一个缓慢的过程
join
可以在C层或更低层上使用可变字符串


如果对象不在列表中。。。这取决于应用程序。但是,我怀疑几乎任何这样的应用程序都必须在某个地方通过循环开销才能形成列表,因此您将失去
join
的一些优势,尽管可变字符串仍然可以节省时间。

是的,
join
速度更快,因为它不需要不断构建新字符串

但使用“加入”不需要列表!您可以为其提供任何iterable,例如:

但是,当您使用
列表时,
join
似乎得到了优化。所有这些都是等效的,但具有列表理解的是最快的

>>> timeit("s=''.join('x' for i in range(200) if i!=47)")
15.870241802178043
>>> timeit("s=''.join(['x' for i in range(200) if i!=47])")
11.294011708363996
>>> timeit("s=''\nfor i in range(200):\n if i!=47:\n  s+='x'")
16.86279364279278

是的,
join
更快,因为它不需要不断构建新字符串

但使用“加入”不需要列表!您可以为其提供任何iterable,例如:

但是,当您使用
列表时,
join
似乎得到了优化。所有这些都是等效的,但具有列表理解的是最快的

>>> timeit("s=''.join('x' for i in range(200) if i!=47)")
15.870241802178043
>>> timeit("s=''.join(['x' for i in range(200) if i!=47])")
11.294011708363996
>>> timeit("s=''\nfor i in range(200):\n if i!=47:\n  s+='x'")
16.86279364279278

通常,您希望避免使用串联以增量方式构建字符串时出现的二次行为。构建字符串列表并使用
str.join
可以保证线性行为。尽管最近对CPython的验证将优化字符串的串联,但这并不能保证。通过将循环向下推到C级别,您还可以获得性能改进。通常,您希望避免在使用串联递增构建字符串时出现的二次行为。构建字符串列表并使用
str.join
可以保证线性行为。尽管最近对CPython的验证将优化字符串的串联,但这并不能保证。通过将循环向下推到C级别,您还可以获得性能改进。感谢您对较低级别优化的评论。感谢您对较低级别优化的评论。