title: Scipy: Speeding up calculation of a 2D complex integral
body: <p>I want to repeatedly calculate a two-dimensional complex integral using dblquad from scipy.integrate. As the number of evaluations will be quite high I would like to increase the evaluation speed of my code.</p>
  
  <p>Dblquad does not seem to be able to handle complex integrands. Thus, I have split the complex integrand into a real and an imaginary part:</p>
  
  <pre><code>def integrand_real(x, y):
      R1=sqrt(x**2 + (y-y0)**2 + z**2)
      R2=sqrt(x**2 + y**2 + zxp**2)
      return real(exp(1j*k*(R1-R2)) * (-1j*z/lam/R2/R1**2) * (1+1j/k/R1))
  
  def integrand_imag(x,y):
      R1=sqrt(x**2 + (y-y0)**2 + z**2)
      R2=sqrt(x**2 + y**2 + zxp**2)
      return imag(exp(1j*k*(R1-R2)) * (-1j*z/lam/R2/R1**2) * (1+1j/k/R1))
  </code></pre>
  
  <p>y0, z, zxp, k, and lam are variables defind in advance. To evaluate the integral over the area of a circle with radius ra I use the following commands:</p>
  
  <pre><code>from __future__ import division
  from scipy.integrate import dblquad
  from pylab import *
  
  def ymax(x):
      return sqrt(ra**2-x**2)
  
  lam = 0.000532
  zxp = 5.
  z = 4.94
  k = 2*pi/lam
  ra = 1.0
  
  res_real = dblquad(integrand_real, -ra, ra, lambda x: -ymax(x), lambda x: ymax(x))
  res_imag = dblquad(integrand_imag, -ra, ra, lambda x: -ymax(x), lambda x: ymax(x))
  res = res_real[0]+ 1j*res_imag[0]
  </code></pre>
  
  <p>According to the profiler the two integrands are evaluated about 35000 times. The total calculation takes about one second, which is too long for the application I have in mind.</p>
  
  <p>I am a beginner to scientific computing with Python and Scipy and would be happy about comments that point out ways of improving the evaluation speed. Are there ways of rewriting the commands in the integrand_real and integrand_complex functions that could lead to siginficant speed improvements? </p>
  
  <p>Would it make sense to compile those functions using tools like Cython? If yes: Which tool would best fit this application?</p>