3 回答
TA贡献1805条经验 获得超10个赞
map + list
注意map可以采用多个可迭代参数:
res = map(hlf, A, B, C)
[-34.86429773960448, -33.68377223398316]
在 Python 2.7 中,map返回一个list. 在 Python 3.x 中map返回一个迭代器,因此您可以延迟迭代或通过list,即耗尽list(map(hfl, A, B, C))。
参考:
地图(函数,可迭代,...)
...如果传递了额外的可迭代参数,则函数必须采用那么多参数并并行应用于所有可迭代项中的项目。
zip + 列表理解
您可以zip在列表理解中使用。为清楚起见,您应该避免将参数命名为与变量相同的名称。
A = [18.0,10.0]; B = [13.0,15.0]; C = [10.5,12.0];
def hlf(x, y, z):
return x**(-1.0/2.0) - 0.2*y - 43 + z
res = [hlf(*vars) for vars in zip(A, B, C)]
[-34.86429773960448, -33.68377223398316]
TA贡献1784条经验 获得超2个赞
使用 Numpy 进行矢量化。最佳表现
通常最好尝试使用 numpy 对此类操作进行矢量化,因为可以获得最佳性能结果。当您改为使用循环进行矢量化时,您正在使用所有内核,这是最快的解决方案。您应该使用 numpy 对操作进行矢量化。像这样的东西:
import numpy as np
A = [18.0,10.0]; B = [13.0,15.0]; C = [10.5,12.0];
a = np.array(A)
b = np.array(B)
c = np.array(C)
现在你的函数带有新的向量,比如参数:
def hlf(a_vector,b_vector,c_vector):
return a_vector**(-1.0/2.0)-0.2*b_vector-43+c_vector
最后调用你的新函数向量化:
print (hlf(a_vector = a,b_vector = b,c_vector = c))
输出:
>>> array([-34.86429774, -33.68377223])
TA贡献1712条经验 获得超3个赞
如果你想保持你的功能不变,你应该用以下方式调用它N:
for i in range(N):
result = hlf(A[i], B[i], C[i])
print(result)
另一个有趣的方法是用你的函数制作一个生成器:
A = [18.0,10.0]
B = [13.0,15.0]
C = [10.5,12.0];
def hlf(*args):
i=0
while i < len(args[0]):
yield args[0][i]**(-1.0/2.0) - 0.2*args[1][i] - 43 + args[2][i]
i += 1
results = hlf(A, B, C)
for r in results:
print(r)
输出:
-34.86429773960448
-33.68377223398316
如果你想练习 python 生成器,最后一个是相当有教育意义的。
- 3 回答
- 0 关注
- 205 浏览
添加回答
举报