Skip to content

Instantly share code, notes, and snippets.

@keflavich
Created December 7, 2015 16:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save keflavich/6a2d338830efdc02959a to your computer and use it in GitHub Desktop.
Save keflavich/6a2d338830efdc02959a to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import fftw3\n",
"import pyfftw\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"x = np.ones([64,64], dtype='float64')\n",
"y = np.empty([64,64], dtype='float64')"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100000 loops, best of 3: 19.7 µs per loop\n"
]
}
],
"source": [
"fft_forward = fftw3.Plan(x.astype('complex'), y, direction='forward',\n",
" nthreads=1)\n",
"%timeit fft_forward.execute()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10000 loops, best of 3: 120 µs per loop\n"
]
}
],
"source": [
"%timeit np.fft.fft2(x)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import timeit\n",
"setup_fftw = (\"import numpy as np; import fftw3; x=np.ones([{size},{size}]); y=np.empty([{size},{size}]);\"\n",
" \"fft_forward = fftw3.Plan(x.astype('complex'), y, direction='forward',\"\n",
" \"nthreads=1)\")\n",
"setup_npfft = (\"import numpy as np; x=np.ones([{size},{size}]);\")\n",
"setup_pyfftw_interface = \"import numpy as np; import pyfftw; x=np.ones([{size},{size}]);\""
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"sizes = range(5,129)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"times_fftw = np.array([timeit.repeat(\"fft_forward.execute()\", setup=setup_fftw.format(size=size), repeat=3, number=100)\n",
" for size in sizes]).mean(axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"times_pyfftw_interface = np.array([timeit.repeat(\"pyfftw.interfaces.numpy_fft.fft2(x)\", setup=setup_pyfftw_interface.format(size=size), repeat=3, number=100)\n",
" for size in sizes]).mean(axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"times_npfft = np.array([timeit.repeat(\"np.fft.fft2(x)\", setup=setup_npfft.format(size=size), repeat=3, number=100)\n",
" for size in sizes]).mean(axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pylab as pl"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10acb2ed0>]"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n5uPAz01EAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10a8c6a90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pl.plot(sizes, times_fftw, color='b')\n",
"pl.plot(sizes, times_npfft, color='r')\n",
"pl.plot(sizes, times_pyfftw_interface, color='g')"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10ad8ca10>]"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10a8fc790>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pl.plot(sizes, times_npfft/times_fftw, color='b')\n",
"pl.plot(sizes, times_pyfftw_interface/times_fftw, color='g')\n",
"pl.plot(sizes, np.ones(len(sizes)), 'k--')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment