Kaggle知識點:NumExpr加速Numpy計算

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)")

Kaggle知識點:NumExpr加速Numpy計算


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)")

Kaggle知識點:NumExpr加速Numpy計算


num = 10000 a = np.random.rand(num) b = np.random.rand(num)

_ = 2*a + b10 + a*b
_ = ne.evaluate("2*a + b10 + a*b")

Kaggle知識點:NumExpr加速Numpy計算


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")

Kaggle知識點:NumExpr加速Numpy計算


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")

Kaggle知識點:NumExpr加速Numpy計算


num = 10000 a = np.random.rand(num).astype(np.bool8) b = np.random.rand(num).astype(np.bool8)

_ = a | b
_ = ne.evaluate("a | b")

Kaggle知識點:NumExpr加速Numpy計算

NumExpr 使用總結

  1. NumExpr支持基礎的運算加速,且對32位浮點數加速比較明顯,但對不同的格式有不同的加速比。

  2. NumExpr隻支持基礎的運算函數,複雜的運算(如循環和索引)邏輯並不支持。

  3. 在數據量比較小的情況下,NumExpr加速並不明顯。且在不同機器,需要設置不同的進程數。

【競賽報名/項目谘詢+微信:mollywei007】

上一篇

加拿大高中12年級物理動力學知識點分享

下一篇

遞交Common App後要還要做什麽?

你也可能喜歡

  • 暫無相關文章!

評論已經被關(guan) 閉。

插入圖片
返回頂部