首先,应该注意的是,在OP的示例中,数组具有相同的元素,因为B = A [:]只是数组的视图,因此:
>>> print A[0], B[0]
1.0, 1.0
但是,虽然测试不合适,但基本的抱怨是正确的:Numpy没有短路等效性检查.
从the source可以很容易地看出allclose,array_equal和array_equiv都只是变体(A == B)以匹配它们各自的细节,并且不会更快.
numpy的一个优点是切片只是视图,因此非常快,因此可以相当容易地编写自己的短路比较(我不是说这是理想的,但确实有效):
from numpy import *
A = zeros(1e8, dtype='float32')
B = A[:]
B[0] = 1
C = array(B)
C[0] = 2
D = array(A)
D[-1] = 2
def short_circuit_check(a, b, n):
L = len(a)/n
for i in range(n):
j = i*L
if not all(a[j:j+L]==b[j:j+L]):
return False
return True
In [26]: %timeit short_circuit_check(A, C, 100) # 100x faster
1000 loops, best of 3: 1.49 ms per loop
In [27]: %timeit all(A==C)
1 loops, best of 3: 158 ms per loop
In [28]: %timeit short_circuit_check(A, D, 100)
10 loops, best of 3: 144 ms per loop
In [29]: %timeit all(A==D)
10 loops, best of 3: 160 ms per loop