Как один из упомянутых комментариев, профилирование кода покажет вам замедления.Возможно, nDeriv
медленно.Если у вас нет инструмента профилирования, вы можете поместить time()
вызовов в каждую часть кода и распечатать результаты.Больше информации здесь: Измерять время, прошедшее в Python?
Итак, если замедление заканчивается в вашем цикле for
, вот несколько вещей, которые вы можете попробовать:
Python может вычислять условие цикла на каждой итерации:
for i in range(int((n - 4) / 2 + 1)):
вычислять int((n - 4) / 2 + 1)
один раз перед циклом.
Не пересчитывайте вещи внутри циклов, которые не меняются.Например,
x / 3
будет пересчитываться при каждой итерации цикла, но он никогда не изменится.Сделайте это до начала цикла.
Аналогично, вы делаете 2 * i
дважды за каждую итерацию цикла.
Сложение происходит быстрее, чем умножение.Аргументы функции могут быть переписаны следующим образом:
xi = x * i
a1 = a + xi + xi + x
a2 = a1 + x
, а затем, сделав еще один шаг, вы также можете сделать еще xi
какаккумулятор.То есть начните с x = 0
, затем каждую итерацию просто x += x
Это, вероятно, очевидно, но если
func()
сложно вычислить, эта функция будет экспоненциально медленной.
Возможно, Python делает для вас множество простых оптимизаций, поэтому они могут не помочь, но просто хотели поделиться некоторыми идеями.