<p>这里不需要使用numpy,通常列表理解就足够了。也就是说<code>l11 = [v.atti1 for v in lst]</code>完全没问题。你知道吗</p>
<p>从概念上讲,您必须迭代所有对象并访问每个对象的属性。你知道吗</p>
<p>关于“为什么你不应该过度工程”的标准:</p>
<pre><code># numpy array builder
np.array([v.atti1 for v in lst])
np.array([v.atti2 for v in lst])
215 ms ± 3.69 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
</code></pre>
<p>这会变慢,因为您首先要理解地构建列表,然后为np数组和copy重新分配内存</p>
<pre><code># single list iteration with appending
l1 = []
l2 = []
for v in lst:
l1.append(v.atti1)
l2.append(v.atti2)
174 ms ± 384 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
</code></pre>
<p>更好,但有很多函数调用<code>.append</code>,最终分配和复制列表。你知道吗</p>
<pre><code># thing that you always start with, no pre-mature optimizations
l1 = [v.atti1 for v in lst]
l2 = [v.atti2 for v in lst]
99.3 ms ± 982 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
</code></pre>
<p>这是更具可读性,Python,做它说的,它的速度更快。在内部,它的速度更快,因为低层次的理解优化。你知道吗</p>
<p>请注意,从3.5开始的CPython(您很可能正在使用)使用<a href="https://www.python.org/dev/peps/pep-0412/" rel="nofollow noreferrer">shared-key dictionaries</a>存储对象属性,从3.6开始,它与紧凑的dict实现合并。两者协同工作-内存效率会极大地提高您的原始性能。你知道吗</p>
<p>不确定VM在运行理解时是否真的利用了共享dict(可能没有),但在99%的情况下这必须留给VM优化。高级抽象语言(如python)实际上与微优化无关。你知道吗</p>