我需要一个更有效的方法来完成以下工作:
for character in commandSequence:
if character == "F":
i += 1
gps = move(fullList.iloc[i-1, 2:].values,
distance, yaw, pitch, 'forward')
fullList.loc[i] = ['Forward', 'Actuated', gps[0], gps[1], gps[2]]
if character == "B":
i += 1
gps = move(fullList.iloc[i-1, 2:].values,
distance, yaw, pitch, 'backward')
fullList.loc[i] = ['Backwards', 'Actuated', gps[0], gps[1], gps[2]]
if character == "+":
yaw = yaw + radians(yaw)
if character == '-':
yaw = yaw - radians(yaw)
if character == "^":
pitch = pitch + radians(pitch)
if character == '.':
pitch = pitch - radians(pitch)
if character == '[':
fullList.iloc[i, 0] = 'Branch'
if character == ']':
if fullList['Description'].value_counts()['Branch'] > 0:
fullList.iloc[i, 0] = 'EOL'
upsideDown = fullList.reindex(
index=fullList.index[::-1]).dropna()
temp = upsideDown.iloc[upsideDown['Description'].eq(
'Branch').idxmax()].values
i += 1
fullList.iloc[i] = temp典型的commandSequence如下所示:
FF+[+FB-+FB-]-FBFF+[+FB-+FB-+FB-]-FB
我需要优化它,因为它是进化算法的一部分,所以有大量的迭代,这意味着我需要尽可能地加快速度。
此外,如果有人可以提供一些指导,我使用profile (来自profilestats )来计时我的代码,并输出了以下内容:
21233966 function calls (20864585 primitive calls) in 46.433 seconds
Ordered by: cumulative time
List reduced from 1994 to 10 due to restriction <10>
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.026 0.026 77.205 77.205 attempt_1.2.py:167(main)
1 0.003 0.003 31.960 31.960 draw.py:1(draw)
8 0.000 0.000 30.788 3.849 pyplot.py:236(show)
8 0.000 0.000 30.788 3.849 backend_bases.py:178(show)
1 0.000 0.000 30.762 30.762 backend_qt5.py:1115(mainloop)
180 0.406 0.002 27.591 0.153 attempt_1.2.py:32(toCoordinates)
180 0.284 0.002 17.542 0.097 attempt_1.2.py:104(absorbArea)
27339/19427 0.328 0.000 12.563 0.001 indexing.py:1463(__getitem__)
12228 0.200 0.000 10.900 0.001 indexing.py:2011(_getitem_tuple)
25706 0.202 0.000 9.834 0.000 indexing.py:2075(_getitem_axis)所以,我说得对吗?我需要加速toCoordinates、absorbArea和任何___getitem___调用(不管它们是什么?)
发布于 2019-04-09 08:15:28
在循环中,您可以向每个if添加“继续”,以避免对所有其他循环进行测试,在这种情况下,循环将转到下一个字符。
if character == "+":
yaw = yaw + radians(yaw)
continue或使用if / elif
if condition1:
some actions
elif condition2:诸若此类
我再也看不出要加速你的循环了
https://stackoverflow.com/questions/55587872
复制相似问题