Из справочного руководства scipy dblquad математически эквивалентен повторяемому квадрату в два раза. Первоначально я думал, что dblquad должно обладать преимуществом производительности в два раза (кроме удобства метода). К моему удивлению, кажется, что производительность dblquad еще хуже. Я взял примеры из «SciPy Reference Guide, 0.14.0 Release» с.12-13 с некоторыми изменениями:Есть ли увеличение производительности dblquad за два квадроцикла?
import scipy
import math
import timeit
def integrand(t, n, x):
return math.exp(-x*t)/t**n
def expint(n, x):
return scipy.integrate.quad(integrand, 1, scipy.Inf, args=(n, x))[0]
def I11():
res = []
for n in range(1,5):
res.append(scipy.integrate.quad(lambda x: expint(n, x), 0, scipy.Inf)[0])
return res
def I2():
res = []
for n in range(1,5):
res.append(scipy.integrate.dblquad(lambda t, x: integrand(t, n, x), 0, scipy.Inf, lambda x: 1, lambda x: scipy.Inf)[0])
return res
print('twice of quad:')
print(I11())
print(timeit.timeit('I11()', setup='from __main__ import I11', number=100))
print('dblquad:')
print(I2())
print(timeit.timeit('I2()', setup='from __main__ import I2', number=100))
Мои выходы выглядеть следующим образом:
twice of quad:
[1.0000000000048965, 0.4999999999985751, 0.33333333325010883, 0.2500000000043577]
5.42371296883
dblquad:
[1.0000000000048965, 0.4999999999985751, 0.33333333325010883, 0.2500000000043577]
6.31611323357
Мы видим, что два метода дают тот же результаты (точные результаты должны быть 1, 1/2, 1/3, 1/4). Но dblquad работает хуже.
У кого-то есть представление о том, что происходит с dblquad? У меня также есть тот же вопрос для tplquad и nquad.
Просто, чтобы убедиться, что Inf (несобственные интеграций) не вызывает проблему, я изменил Inf к ряду, как 5, 10, и 50. Результаты показывают, что dblquad тратит на 15% больше времени, чем двойной квад. – sunheng