NumExpr是NumPy的快速數值表達式求值器。NumExpr對使用表達式(如3*a+4*b)進行計算,並且比在Python中執行相同的計算使用更少的內(nei) 存。
NumExpr 基礎使用
NumExpr擁有更好的性能的主要原因是它避免了為(wei) 中間結果分配內(nei) 存,這導致減少一般的內(nei) 存訪問。因此NumExpr最適用於(yu) 大型數組。
安裝方法:
pip install numexpr
使用案例:
import numpy as np import numexpr as ne
a = np.random.rand(10000)
b = np.random.rand(10000)
# 等同於(yu) 2*a + b10 ne.evaluate("2*a + b10")
NumExpr 數據格式
NumExpr僅(jin) 在內(nei) 部使用以下類型運行:
- 8 位布爾值 (bool)
- 32 位有符號整數(int 或 int32)
- 64 位有符號整數(long 或 int64)
- 32 位單精度浮點數(float 或 float32)
- 64 位雙精度浮點數(double 或 float64)
- 2x64 位雙精度複數(complex 或 complex128)
- 原始字節串 (str)
如果表達式中的數組不匹配這些類型中的任何一種,它們(men) 將被向上轉換為(wei) 上述類型之一.
NumExpr 運算符
NumExpr 支持下麵列出的一組運算符:
- Logical operators: &, |, ~
- Comparison operators: <, <=, ==, !=, >=, >
- Unary arithmetic operators: -
- Binary arithmetic operators: +, -, *, /, , %, <<, >>
NumExpr 函數運算
NumExpr 支持下列內(nei) 置函數:
- where
- sin,cos,tan
- arcsin,arccos,arctan
- arctan2
- sinh,cosh,tanh
- arcsinh,arccosh,arctanh
- log,log10,log1p
- exp,expm1
- conj,real,imag,complex
- contains
NumExpr 使用案例
num = 10000 a = np.random.rand(num) b = np.random.rand(num)
_ = 2*a + b10 + np.log(a) * np.log(b)
_ = ne.evaluate("2*a + b10 + log(a) * log(b)")
num = 10000 a = np.random.rand(num) b = np.random.rand(num)
_ = 2*a + b10 + np.abs(a)
_ = ne.evaluate("2*a + b10 + abs(a)")
num = 10000 a = np.random.rand(num) b = np.random.rand(num)
_ = 2*a + b10 + a*b
_ = ne.evaluate("2*a + b10 + a*b")
num = 10000 a = np.random.rand(num).astype(int16) b = np.random.rand(num).astype(int16)
_ = 2*a + b10 + a*b
_ = ne.evaluate("2*a + b10 + a*b")
num = 10000 a = np.random.rand(num).astype(int32) b = np.random.rand(num).astype(int32)
_ = 2*a + b10 + a*b
_ = ne.evaluate("2*a + b10 + a*b")
num = 10000 a = np.random.rand(num).astype(np.bool8) b = np.random.rand(num).astype(np.bool8)
_ = a | b
_ = ne.evaluate("a | b")
NumExpr 使用總結
-
NumExpr支持基礎的運算加速,且對32位浮點數加速比較明顯,但對不同的格式有不同的加速比。
-
NumExpr隻支持基礎的運算函數,複雜的運算(如循環和索引)邏輯並不支持。
-
在數據量比較小的情況下,NumExpr加速並不明顯。且在不同機器,需要設置不同的進程數。
評論已經被關(guan) 閉。