numexpr.evaluate("a+b", out=a) 的用法

21 投票
1 回答
3464 浏览
提问于 2025-04-17 19:09

在使用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如何进行向量化算术运算的伪代码。

撰写回答