在python numexpr中为您正在操作的相同数组赋值以避免创建临时数组是否安全?
从项目主页上的内存使用描述来看,它看起来不错,但如果不深入研究源代码,这几乎不是一个可靠的答案。
我尝试了以下工作良好,但我希望从更熟悉这个包的人确认:
import numpy as np
import numexpr as ne
a = np.ones(5)
b = a.copy()
ne.evaluate("a+b",out=a)
array([ 2., 2., 2., 2., 2.])
它可以工作,因为numexpr仍然在内部使用临时数组,尽管块大小为1024个元素(如果使用VML则为4096个)。您可以将这些输入块视为片,尽管在求值期间,为了速度和内存紧凑性,它们被存储为适当的C数据类型。在执行每个块的计算之后,结果将存储到out参数中,否则它必须分配一个与输入大小相同的数组。
查看numexpr如何计算向量化算法的伪代码Why It Works。