อีกทางเลือกหนึ่งคือการใช้einsum
ฟังก์ชั่นใน numpy สำหรับอาร์เรย์อย่างใดอย่างหนึ่ง:
In [1]: import numpy as np
In [2]: a = np.arange(1200.0).reshape((-1,3))
In [3]: %timeit [np.linalg.norm(x) for x in a]
100 loops, best of 3: 3.86 ms per loop
In [4]: %timeit np.sqrt((a*a).sum(axis=1))
100000 loops, best of 3: 15.6 µs per loop
In [5]: %timeit np.sqrt(np.einsum('ij,ij->i',a,a))
100000 loops, best of 3: 8.71 µs per loop
หรือเวกเตอร์:
In [5]: a = np.arange(100000)
In [6]: %timeit np.sqrt(a.dot(a))
10000 loops, best of 3: 80.8 µs per loop
In [7]: %timeit np.sqrt(np.einsum('i,i', a, a))
10000 loops, best of 3: 60.6 µs per loop
อย่างไรก็ตามมีดูเหมือนจะมีค่าใช้จ่ายที่เกี่ยวข้องกับการโทรมันที่อาจทำให้มันช้าลงด้วยอินพุตเล็ก ๆ :
In [2]: a = np.arange(100)
In [3]: %timeit np.sqrt(a.dot(a))
100000 loops, best of 3: 3.73 µs per loop
In [4]: %timeit np.sqrt(np.einsum('i,i', a, a))
100000 loops, best of 3: 4.68 µs per loop
linalg.norm
ตามที่ระบุไว้ด้านล่าง แต่ง่ายกว่าสิ่งที่แลมบ์ดาของคุณเล็กน้อยกับการนำเข้าไม่จำเป็นต้องเป็นเพียงsum(x*x)**0.5