<p>回答标题中的问题:</p>
<blockquote>
<p>Should I store <code>len(list)</code> somewhere?</p>
</blockquote>
<p>获得一个列表的长度需要<em>O(1)</em>时间,而且通常相当快。在您的第一个代码片段中,您将获得列表的长度<em>O(n)</em>次,但是与算法的<em>O(n<sup>2</sup>)</em>时间复杂度相比,这不是显著的</em>。你知道吗</p>
<p>严格地说,我们当然不知道计算列表长度的时间复杂度(因为任何Python解释器可能会以不同的方式进行)。但是最流行的解释器CPython使用<a href="https://github.com/python/cpython/blob/1a5856bf9295fa73995898d576e0bedf016aee1f/Include/listobject.h#L23" rel="nofollow noreferrer">following datastructure</a>:</p>
<pre><code>typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;
</code></pre>
<p>它包含一个字段<code>allocated</code>,该字段存储可在固定时间内检索的已占用单元格数。你知道吗</p>
<p>然而,您的程序在某种意义上是奇怪的,因为您在列表的索引上迭代,而不是在列表的<em>元素上迭代。如果您想处理这些元素,那么使用这些元素会更加优雅和高效:</p>
<pre><code># processing the elements of the list:
some_list = [1,4,2,5]
for elem1 in some_list:
for elem2 in some_list:
print(elem1+elem2)
</code></pre>
<p>最后,我想补充一点,Python并不是真正被设计成最高效的编程环境。Python选择程序员的方便而不是速度(因为基本原理是<em>开发时间</em>比<em>处理时间</em>更昂贵)。因此,如果多次获得列表的长度确实是一个关键问题,那么Python可能不是处理列表的好选择。在这种情况下,您最好使用像<code>numpy</code>这样的库,它们被设计成批量处理。这些库将一些数组处理函数与Python连接起来,但在更高效的环境中进行处理。你知道吗</p>