<p>根据评论中的解释,问题似乎如下:</p>
<ul>
<li>一个大的阵列需要经常更新,并且尽可能的高效</li>
<li>更新源不仅是其他numpy数组,而且是任意Python对象(可以动态生成)。在</li>
</ul>
<p>第二个问题是:只要您的值来自Python,将它们放入numpy数组将不会真正有效。这是因为您必须循环处理解释代码中的每个值。在</p>
<blockquote>
<p>I was expecting to find the expression <code>for ind, elem in enumerate(iterable): my_array[ind] = elem</code> already packaged in a built in function. Do you know if the Python interpreter compiles that expression as a whole?</p>
</blockquote>
<P> CPython的虚拟机与C++模型有很大不同;具体来说,编译器不能将表达式内嵌或将其解释为整体,以使其显著地更有效。即使它支持在C中执行这一特定操作的字节码指令,它仍然需要调用生成器的<code>next</code>方法,该方法在执行Python字节码之后,将每个值生成为堆分配的Python对象。在这两种情况下,每次迭代都会涉及到解释的代码,而您确实希望避免这种情况。在</p>
<p>解决问题的有效方法是从头开始设计,不要离开numpy。正如其他人在评论中所解释的那样,与在Python中逐个处理数据的实际成本相比,分配的成本(如果有效的话,由numpy完成)是微不足道的。我将设计如下:</p>
<ul>
<li>将尽可能多的代码转换为以本机方式使用numpy数组,从头开始;将返回numpy数组作为接口的一部分,而不必担心分配成本。在numpy内部尽可能多地执行循环,因此它们是用本机代码完成的。永远不要在Python中迭代大型数组的所有值。在</li>
<li>如果不能使用numpy,请使用<code>numpy.fromiter</code>尽早将迭代器转换为numpy数组。在</li>
<li>使用<code>my_array[:] = new_array[:]</code>或{<cd4>}将新值引入数组。(前者在显微镜下需要更多的时间,但是当<code>my_array</code>在数据模型中的许多地方被共享时,它就更有意义了。)</li>
<li><strong>基准</strong>您感兴趣的操作。不要假设“复制是慢的”——它可能会证明C++中的操作“慢”比在C++中高效的Python再现更快。在</li>
</ul>
<p>如果在完成上述操作之后,numpy不支持某些操作,并且测量结果表明它效率极低,那么可以使用<a href="https://docs.python.org/3/extending/index.html" rel="nofollow noreferrer">Python/C API</a>创建一个扩展模块,该模块高效地执行计算并以C中创建的numpy数组的形式返回结果</p>