Более эффективный метод строки для команды - PullRequest
0 голосов
/ 09 апреля 2019

Мне нужен более эффективный метод для выполнения следующих действий:

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

Типичная последовательность команд выглядит следующим образом:
FF + [+ [FB] - +[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 , абсорбировать область и любые __getitem __ звонки (что бы это ни было ??)

1 Ответ

1 голос
/ 09 апреля 2019

В вашем цикле вы можете добавить продолжить к каждому, если хотите избежать проверки всех остальных, если в этом случае цикл переходит к следующему символу.

    if character == "+":
        yaw = yaw + radians(yaw)
        continue

или с помощью if / elif

   if condition1:
      some actions

   elif condition2:

и так далее

я больше не вижу, чтобы ускорить ваш цикл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...