numexpr.evaluate("a+b", out=a) 的用法
在使用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.])
1 个回答
8
它之所以能工作,是因为numexpr在内部仍然使用临时数组,不过这些数组的大小是1024个元素(如果使用VML的话,就是4096个)。你可以把这些输入的块想象成切片,虽然它们在计算时以适合的C语言数据类型存储,这样可以提高速度和节省内存。每计算完一个块,结果会存储到输出参数中,否则它就得分配一个和输入大小一样的数组。
可以查看为什么它能工作这一部分,里面有numexpr如何进行向量化算术运算的伪代码。