<p>感谢大家帮助我理解了那条可怕的Python。在</p>
<p>我不想提出这么大的问题(为什么我要发布答案),只想展示和分享我的想法。在</p>
<p>正如<a href="https://stackoverflow.com/users/948550/reut-sharabani">@ReutSharabani</a>正确指出的:“list()决定了列表大小”。从图中可以看出。在</p>
<p><a href="https://i.stack.imgur.com/JrqC9.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/JrqC9.png" alt="graph of sizes"/></a></p>
<p>当你<code>append</code>或使用列表理解时,你总会有某种边界,当你到达某个点时,这些边界就会延伸。使用<code>list()</code>你有几乎相同的边界,但是它们是浮动的。在</p>
<p><strong>更新</strong></p>
<p>感谢<a href="https://stackoverflow.com/users/948550/reut-sharabani">@ReutSharabani</a>,<a href="https://stackoverflow.com/users/3101871/tavo">@tavo</a>,<a href="https://stackoverflow.com/users/5480526/sven-festersen">@SvenFestersen</a></p>
<p>总而言之:<code>list()</code>根据列表大小预先分配内存,列表理解无法做到这一点(它在需要时请求更多内存,如<code>.append()</code>)。这就是<code>list()</code>存储更多内存的原因。在</p>
<p>还有一个图,显示<code>list()</code>预分配内存。所以绿线显示<code>list(range(830))</code>一个元素地追加元素,并且在一段时间内内存没有改变。在</p>
<p><a href="https://i.stack.imgur.com/yoV85.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/yoV85.png" alt="list() preallocates memory"/></a></p>
<p><strong>更新2</strong></p>
<p>正如@Barmar在下面的评论中指出的,<code>list()</code>必须比列表理解快,所以我用<code>number=1000</code>运行<code>timeit()</code>,从<code>4**0</code>到{<cd13>},结果是</p>
<p><a href="https://i.stack.imgur.com/WNSnO.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/WNSnO.png" alt="time measurements"/></a></p>