Ускорение / векторизация вложенного цикла в Python - PullRequest
0 голосов
/ 04 июня 2018

Я реализовал скрипт Python, и мне нужно использовать 4 вложенных цикла.Я понял, что это делает решение очень медленным.Я также заметил, что подобный цикл в Matlab намного быстрее, чем в Python.

1) Почему тот же цикл в Matlab быстрее, чем в Python?

2) Как я могу улучшить свой код Python (например, векторизация)?Я попробовал функции itertools (комбинации, продукт), но они не ускоряют вычисления.

Я создал класс точек - каждая точка имеет координаты и скорости, и я вычисляю расстояние между ними идругие количества

N = 1000
for i in range(0,N-1):
    for i2 in range(0,10):
        if p[i].id[i2] == 1:    # check if point is active
            ri = p[i].r[i2]
            vi = p[i].v
        else:
            pass

        for j in range(i+1,N):
            for j2 in range(0,10):
                if p[j].id[j2] == 1:
                    rj = p[j].r[j2]
                    vj = p[j].v
                else:
                    pass

#            and the rest of my function

Кто-нибудь может мне помочь?

большое спасибо!

1 Ответ

0 голосов
/ 04 июня 2018

Что касается производительности Python против Matlab, я рекомендую взглянуть на http://wiki.scipy.org/PerformancePython. Очевидно, что скорость связана с проблемой, которую необходимо решить, но я думаю, что для чисто математических / физических расчетов и моделирования Matlab будет иметьверх (конечно, предназначен для этих целей).

Что касается вашего кода, Python имеет множество инструментов для повышения производительности, например, с использованием генераторов или для математических приложений., Numpy's (обернутый в C) ndarrays.Если вы серьезно относитесь к высокопроизводительному Python, вы также можете попробовать PyPy или Cython.

Также я помню, что где-то читал (обновлю, если найду ссылку), что просто с помощью вызовов функций и классов Python, кодавыполнение значительно ускоряется, поскольку байт-код может быть более эффективно интерпретирован.

Я бы также указал вам направление этого ответа https://stackoverflow.com/a/16752469/9889462 в качестве начала для ускорения вашего кода с помощью генераторов.Надеюсь, это поможет

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