擅长:python、mysql、java
<p><a href="https://stackoverflow.com/a/57043468/6451573">This answer</a>解释了默认参数,但是<code>sum</code>不应该<em>被用来展平元组或列表,因为二次方面。见<a href="https://stackoverflow.com/questions/42593904/could-sum-be-faster-on-lists">could sum be faster on lists</a></p>
<p>所以:</p>
<blockquote>
<p>Why does the 2nd parameter to the sum() can be an empty tuple? Shouldn't it be a number </p>
</blockquote>
<p>是的,它应该是一个数字,<code>sum</code>应该总是应用于数字元素,如果你想保持这个效率的话。此默认参数用于提供<code>0</code>或<code>0.0</code>的替代方法。你知道吗</p>
<p>每次遇到要求和的项时,它都不会执行就地加法,而是执行类似(内部)的操作:</p>
<pre><code>result = result + new_item
</code></pre>
<p>这会导致<code>O(n**2)</code>或<code>list</code>的复杂性,因为每次迭代都需要复制旧内容。所以不要这样做(注意它是显式地为<code>str</code>类型阻塞的)。你知道吗</p>
<p>相反,使用双平面压缩并从中创建<code>tuple</code>:</p>
<pre><code>tmp=((1,2), ('a','b'))
result = tuple(x for st in tmp for x in st)
</code></pre>
<p>如果你的元组有很多元素,你会看到速度的不同。你知道吗</p>