如何解决重写 if 条件以在 python 中加速
我在函数中有以下带有 if 语句的代码。当我运行它会花费很长时间,这是一种重写 if 条件的方法还是一种加速此示例代码的方法?
import numpy as np
def func(S,R,H):
ST = S * R
if ST <= - H:
result = - H
elif ST >= - H and ST < 0:
result = ST
else:
result = min(ST,H)
return result
y=[]
t1= time()
for x in np.arange(0,10000,0.001):
y.append(func(3,5,x))
t2 = time()
print("time with numpy arange:",t2-t1)
运行代码所需的时间:
10 s
这是真实代码的复制示例,在真实代码中 ST 变成负值和正值,我们可以保留条件,但将 if 语句更改为其他内容可能有助于更快地执行任务!
解决方法
如果您希望您的函数参数仍然可用,您需要以创造性的方式使用布尔索引并将您的函数替换为:
from time import time
import numpy as np
ran = np.arange(-10,10,1)
s = 2
r = 3
st = s * r
def func(S,R,H):
ST = S * R
if ST <= - H:
result = - H
elif ST >= - H and ST < 0:
result = ST
else:
result = min(ST,H)
return result
# calculate with function
a = []
t1 = time()
for x in ran:
a.append(func(s,r,x))
t2 = time()
print("time with function:",t2 - t1)
a = np.array(a)
# calculate with numpy
y = np.copy(ran)
neg_y = np.copy(y) * -1
# creative boolean indexing
t1 = time()
y[st <= neg_y] = neg_y[st <= neg_y]
if st < 0:
y[st >= neg_y] = st
else:
alike = np.full(ran.shape,st)[st >= neg_y]
y[st > neg_y] = np.where(y[st > neg_y] > st,st,y[st > neg_y])
t2 = time()
print(a)
print(y)
print("time with numpy indexing:",t2 - t1)
会给你(时间省略):
# s=2,r=3
[10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -6 -6 -6] # function
[10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -6 -6 -6] # numpy
# s=-2,s=3
[10 9 8 7 6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 6 6 6] # function
[10 9 8 7 6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 6 6 6] # numpy
您可能需要稍微调整一下。
使用
ran = np.arange(-1000,1000,0.001)
我得到以下时间 (s=3,r=5):
time with function: 5.606577634811401
[1000. 999.999 999.998 ... 15. 15. 15. ]
[1000. 999.999 999.998 ... 15. 15. 15. ]
time with numpy indexing: 0.06600046157836914
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。