PIPIONE
应用该函数的“直接”方法始终是在Numpy数组上映射函数的最快和最简单的方法:import numpy as np
x = np.array([1, 2, 3, 4, 5])f = lambda x: x ** 2squares = f(x)一般避免np.vectorize,因为它没有很好的表现,并且有(或有)一些问题..如果您正在处理其他数据类型,则可能需要研究下面所示的其他方法。方法比较下面是一些简单的测试来比较三个方法来映射一个函数,这个例子使用Python3.6和NumPy1.15.4。首先,用于测试的设置函数:import timeitimport numpy as np
f = lambda x: x ** 2vf = np.vectorize(f)def test_array(x, n):
t = timeit.timeit(
'np.array([f(xi) for xi in x])',
'from __main__ import np, x, f', number=n)
print('array: {0:.3f}'.format(t))def test_fromiter(x, n):
t = timeit.timeit(
'np.fromiter((f(xi) for xi in x), x.dtype, count=len(x))',
'from __main__ import np, x, f', number=n)
print('fromiter: {0:.3f}'.format(t))def test_direct(x, n):
t = timeit.timeit(
'f(x)',
'from __main__ import x, f', number=n)
print('direct: {0:.3f}'.format(t))def test_vectorized(x, n):
t = timeit.timeit(
'vf(x)',
'from __main__ import x, vf', number=n)
print('vectorized: {0:.3f}'.format(t))使用五个元素(从最快到最慢)进行测试:x = np.array([1, 2, 3, 4, 5])n = 100000test_direct(x, n) # 0.265test_fromiter(x, n) # 0.479test_array(x, n)
# 0.865test_vectorized(x, n) # 2.906有100多个元素:x = np.arange(100)n = 10000test_direct(x, n) # 0.030test_array(x, n) # 0.501test_vectorized(x, n)
# 0.670test_fromiter(x, n) # 0.883以及1000 s或更多的数组元素:x = np.arange(1000)n = 1000test_direct(x, n) # 0.007test_fromiter(x, n) # 0.479test_array(x, n)
# 0.516test_vectorized(x, n) # 0.945不同版本的Python/NumPy和编译器优化将有不同的结果,因此对您的环境进行类似的测试。