[pythran] Re: Cython vs Pythran on a very simple function

  • From: serge guelton <serge.guelton@xxxxxxxxxxxxxxxxxxx>
  • To: pythran@xxxxxxxxxxxxx
  • Date: Fri, 28 Apr 2017 16:11:13 +0200

On Fri, Apr 28, 2017 at 01:39:14PM +0200, PIERRE AUGIER wrote:

Hello,

I compare Cython and Pythran on a very simple function and I am a little bit 
disappointed by what I get:

# pythran export gradfft_from_fft(complex128[][], float64[][], float64[][])

def gradfft_from_fft(f_fft, KX, KY):
    px_f_fft = 1j * KX * f_fft
    py_f_fft = 1j * KY * f_fft
    return px_f_fft, py_f_fft

I focussed on what we can get only with one core (no OpenMP).

The cython version with @cython.boundscheck(False) and 
@cython.wraparound(False) is faster than the pythranized function. Pythran is 
"only" as good as Cython without @cython.boundscheck(False) and 
@cython.wraparound(False)...

The code is here: 
https://bitbucket.org/fluiddyn/fluidfft/src/88c55f8ed44ef33a01e3f532518b4ba44672aab1/scripts/compare_cypythran/?at=default

Can Pythran reach the performance of Cython in this case?

Hi Pierre and thanks for providing a detailed way to reproduce your
performance issue. It turns out I cannot reproduce your issue. Here is
the outcome of running your bench on my laptop:

    # python
    python -m perf timeit -s 'from bench import gradfft_from_fft_py as g, 
f_fft, KX, KY' 'g(f_fft, KX, KY)'
    .....................
    Median +- std dev: 23.0 ms +- 0.1 ms
    # pythran
    python -m perf timeit -s 'from bench import gradfft_from_fft as g, f_fft, 
KX, KY' 'g(f_fft, KX, KY)'
    .....................
    Median +- std dev: 10.2 ms +- 0.1 ms
    # cython with @cython.boundscheck(False) @cython.wraparound(False)
    python -m perf timeit -s 'from bench import gradfft_from_fft_nocheck_cy as 
g, f_fft, KX, KY' 'g(f_fft, KX, KY)'
    .....................
    Median +- std dev: 13.5 ms +- 0.3 ms
    # cython without @cython.boundscheck(False) @cython.wraparound(False)
    python -m perf timeit -s 'from bench import gradfft_from_fft_check_cy as g, 
f_fft, KX, KY' 'g(f_fft, KX, KY)'
    .....................
    Median +- std dev: 15.3 ms +- 0.8 ms

As your code uses complex number, I activated the following in my
.pythranrc:

    [pythran]
    complex_hook = True

Without this, complex multiplication is more accurate with respect to
NaN and inf, but slower. Even without it, I get roughly the same perf
between cython with bound checks and pythran.

I'm using gcc6 and that may be the key difference between our two
setups?


Other related posts: