Skip to content

Instantly share code, notes, and snippets.

@cottrell
Forked from anonymous/gibbs.ipynb
Created February 25, 2014 05:40
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 cottrell/0ace35ea080f8ecd2ad7 to your computer and use it in GitHub Desktop.
Save cottrell/0ace35ea080f8ecd2ad7 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Playing around with timings of Darren Wilkinson's Gibbs sampler example\n",
"\n",
"http://darrenjw.wordpress.com/2011/07/16/gibbs-sampler-in-various-languages-revisited/"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import random, math, time\n",
"import scipy.stats.distributions as ssd\n",
"import numpy.random as nr\n",
"import numpy\n",
" \n",
"def gibbs(N=5000, thin=100):\n",
" x=0\n",
" y=0\n",
"\n",
" out = []\n",
" for i in range(N):\n",
" for j in range(thin):\n",
" x=random.gammavariate(3,1.0/(y*y+4))\n",
" y=random.gauss(1.0/(x+1),1.0/math.sqrt(2*x+2))\n",
" out += [[x, y]]\n",
" out = numpy.array(out)\n",
" return(out)\n",
"\n",
"def gibbs1(N=5000, thin=100):\n",
" x=0\n",
" y=0\n",
" out = []\n",
" for i in range(N):\n",
" for j in range(thin):\n",
" x = nr.gamma(3, 1.0 / (y * y + 4))\n",
" y = nr.normal(1.0 / (x + 1), 1.0 / math.sqrt(2 * x + 2)) \n",
" out += [[x, y]]\n",
" out = numpy.array(out)\n",
" return(out)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 147
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%load_ext cythonmagic"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The cythonmagic extension is already loaded. To reload it, use:\n",
" %reload_ext cythonmagic\n"
]
}
],
"prompt_number": 136
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%cython -a\n",
"# non-optimize cython hack, probably some way to reach down to numpy c libraries\n",
"cimport cython\n",
"import numpy\n",
"cimport numpy\n",
"from libc.math cimport sqrt\n",
"@cython.cdivision(True)\n",
"def gibbs_cython(int N=5000, int thin=100):\n",
" cdef double x = 0, y = 0\n",
" out = []\n",
" for i in range(N):\n",
" for j in range(thin):\n",
" x = numpy.random.gamma(3, 1.0 / (y * y + 4))\n",
" y = numpy.random.normal(1.0 / (x + 1), 1.0 / sqrt(2 * x + 2)) \n",
" out += [[x, y]]\n",
" out = numpy.array(out)\n",
" return(out)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<!DOCTYPE html>\n",
"<!-- Generated by Cython 0.20.1 on Mon Feb 24 23:46:37 2014 -->\n",
"<html>\n",
"\n",
"<head>\n",
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n",
"<style type=\"text/css\">\n",
"\n",
"body { font-family: courier; font-size: 12; }\n",
"\n",
".code { font-size: 9; color: #444444; display: none; margin-left: 20px; }\n",
".py_c_api { color: red; }\n",
".py_macro_api { color: #FF7000; }\n",
".pyx_c_api { color: #FF3000; }\n",
".pyx_macro_api { color: #FF7000; }\n",
".refnanny { color: #FFA000; }\n",
"\n",
".error_goto { color: #FFA000; }\n",
"\n",
".tag { }\n",
"\n",
".coerce { color: #008000; border: 1px dotted #008000 }\n",
"\n",
".py_attr { color: #FF0000; font-weight: bold; }\n",
".c_attr { color: #0000FF; }\n",
"\n",
".py_call { color: #FF0000; font-weight: bold; }\n",
".c_call { color: #0000FF; }\n",
"\n",
".line { margin: 0em }\n",
"\n",
"</style>\n",
"<script>\n",
"function toggleDiv(id) {\n",
" theDiv = document.getElementById(id);\n",
" if (theDiv.style.display != 'block') theDiv.style.display = 'block';\n",
" else theDiv.style.display = 'none';\n",
"}\n",
"</script>\n",
"</head>\n",
" <body>\n",
"<p>Generated by Cython 0.20.1 on Mon Feb 24 23:46:37 2014\n",
"<pre class='line' style='background-color: #FFFF79' onclick='toggleDiv(\"line1\")'> 1: # non-optimize cython hack, probably some way to reach down to numpy c libraries</pre>\n",
"<pre id='line1' class='code' style='background-color: #FFFF79'> __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_test, __pyx_t_1) &lt; 0) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line2\")'> 2: cimport cython</pre>\n",
"<pre id='line2' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF8d' onclick='toggleDiv(\"line3\")'> 3: import numpy</pre>\n",
"<pre id='line3' class='code' style='background-color: #FFFF8d'> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_numpy, 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_numpy, __pyx_t_1) &lt; 0) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line4\")'> 4: cimport numpy</pre>\n",
"<pre id='line4' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line5\")'> 5: from libc.math cimport sqrt</pre>\n",
"<pre id='line5' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line6\")'> 6: @cython.cdivision(True)</pre>\n",
"<pre id='line6' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF29' onclick='toggleDiv(\"line7\")'> 7: def gibbs_cython(int N=5000, int thin=100):</pre>\n",
"<pre id='line7' class='code' style='background-color: #FFFF29'>/* Python wrapper */\n",
"static PyObject *__pyx_pw_46_cython_magic_b5f9c8fec2244fa850f9ed1f9e85434f_1gibbs_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
"static PyMethodDef __pyx_mdef_46_cython_magic_b5f9c8fec2244fa850f9ed1f9e85434f_1gibbs_cython = {<span class='pyx_macro_api'>__Pyx_NAMESTR</span>(\"gibbs_cython\"), (PyCFunction)__pyx_pw_46_cython_magic_b5f9c8fec2244fa850f9ed1f9e85434f_1gibbs_cython, METH_VARARGS|METH_KEYWORDS, <span class='pyx_macro_api'>__Pyx_DOCSTR</span>(0)};\n",
"static PyObject *__pyx_pw_46_cython_magic_b5f9c8fec2244fa850f9ed1f9e85434f_1gibbs_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n",
" int __pyx_v_N;\n",
" int __pyx_v_thin;\n",
" PyObject *__pyx_r = 0;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"gibbs_cython (wrapper)\", 0);\n",
" {\n",
" static PyObject **__pyx_pyargnames[] = {&amp;__pyx_n_s_N,&amp;__pyx_n_s_thin,0};\n",
" PyObject* values[2] = {0,0};\n",
" if (unlikely(__pyx_kwds)) {\n",
" Py_ssize_t kw_args;\n",
" const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args);\n",
" switch (pos_args) {\n",
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
" case 0: break;\n",
" default: goto __pyx_L5_argtuple_error;\n",
" }\n",
" kw_args = <span class='py_c_api'>PyDict_Size</span>(__pyx_kwds);\n",
" switch (pos_args) {\n",
" case 0:\n",
" if (kw_args &gt; 0) {\n",
" PyObject* value = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_N);\n",
" if (value) { values[0] = value; kw_args--; }\n",
" }\n",
" case 1:\n",
" if (kw_args &gt; 0) {\n",
" PyObject* value = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_thin);\n",
" if (value) { values[1] = value; kw_args--; }\n",
" }\n",
" }\n",
" if (unlikely(kw_args &gt; 0)) {\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_ParseOptionalKeywords</span>(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"gibbs_cython\") &lt; 0)) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" }\n",
" } else {\n",
" switch (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)) {\n",
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
" case 0: break;\n",
" default: goto __pyx_L5_argtuple_error;\n",
" }\n",
" }\n",
" if (values[0]) {\n",
" __pyx_v_N = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(values[0]);<span class='error_goto'> if (unlikely((__pyx_v_N == (int)-1) &amp;&amp; PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" } else {\n",
" __pyx_v_N = ((int)5000);\n",
" }\n",
" if (values[1]) {\n",
" __pyx_v_thin = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(values[1]);<span class='error_goto'> if (unlikely((__pyx_v_thin == (int)-1) &amp;&amp; PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" } else {\n",
" __pyx_v_thin = ((int)100);\n",
" }\n",
" }\n",
" goto __pyx_L4_argument_unpacking_done;\n",
" __pyx_L5_argtuple_error:;\n",
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"gibbs_cython\", 0, 0, 2, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" __pyx_L3_error:;\n",
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_b5f9c8fec2244fa850f9ed1f9e85434f.gibbs_cython\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
" return NULL;\n",
" __pyx_L4_argument_unpacking_done:;\n",
" __pyx_r = __pyx_pf_46_cython_magic_b5f9c8fec2244fa850f9ed1f9e85434f_gibbs_cython(__pyx_self, __pyx_v_N, __pyx_v_thin);\n",
" int __pyx_lineno = 0;\n",
" const char *__pyx_filename = NULL;\n",
" int __pyx_clineno = 0;\n",
"\n",
" /* function exit code */\n",
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
"static PyObject *__pyx_pf_46_cython_magic_b5f9c8fec2244fa850f9ed1f9e85434f_gibbs_cython(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_N, int __pyx_v_thin) {\n",
" double __pyx_v_x;\n",
" double __pyx_v_y;\n",
" PyObject *__pyx_v_out = NULL;\n",
" CYTHON_UNUSED int __pyx_v_i;\n",
" CYTHON_UNUSED int __pyx_v_j;\n",
" PyObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"gibbs_cython\", 0);\n",
"/* \u2026 */\n",
" /* function exit code */\n",
" __pyx_L1_error:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_7);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_9);\n",
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_b5f9c8fec2244fa850f9ed1f9e85434f.gibbs_cython\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" __pyx_r = NULL;\n",
" __pyx_L0:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_out);\n",
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n",
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
" return __pyx_r;\n",
"}\n",
"/* \u2026 */\n",
" __pyx_tuple__7 = <span class='py_c_api'>PyTuple_Pack</span>(7, __pyx_n_s_N, __pyx_n_s_thin, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_out, __pyx_n_s_i, __pyx_n_s_j);<span class='error_goto'> if (unlikely(!__pyx_tuple__7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__7);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__7);\n",
"/* \u2026 */\n",
" __pyx_t_1 = PyCFunction_NewEx(&amp;__pyx_mdef_46_cython_magic_b5f9c8fec2244fa850f9ed1f9e85434f_1gibbs_cython, NULL, __pyx_n_s_cython_magic_b5f9c8fec2244fa850);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_gibbs_cython, __pyx_t_1) &lt; 0) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line8\")'> 8: cdef double x = 0, y = 0</pre>\n",
"<pre id='line8' class='code' style='background-color: #FFFFff'> __pyx_v_x = 0.0;\n",
" __pyx_v_y = 0.0;\n",
"</pre><pre class='line' style='background-color: #FFFFaa' onclick='toggleDiv(\"line9\")'> 9: out = []</pre>\n",
"<pre id='line9' class='code' style='background-color: #FFFFaa'> __pyx_t_1 = <span class='py_c_api'>PyList_New</span>(0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" __pyx_v_out = __pyx_t_1;\n",
" __pyx_t_1 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line10\")'> 10: for i in range(N):</pre>\n",
"<pre id='line10' class='code' style='background-color: #FFFFff'> __pyx_t_2 = __pyx_v_N;\n",
" for (__pyx_t_3 = 0; __pyx_t_3 &lt; __pyx_t_2; __pyx_t_3+=1) {\n",
" __pyx_v_i = __pyx_t_3;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line11\")'> 11: for j in range(thin):</pre>\n",
"<pre id='line11' class='code' style='background-color: #FFFFff'> __pyx_t_4 = __pyx_v_thin;\n",
" for (__pyx_t_5 = 0; __pyx_t_5 &lt; __pyx_t_4; __pyx_t_5+=1) {\n",
" __pyx_v_j = __pyx_t_5;\n",
"</pre><pre class='line' style='background-color: #FFFF3e' onclick='toggleDiv(\"line12\")'> 12: x = numpy.random.gamma(3, 1.0 / (y * y + 4))</pre>\n",
"<pre id='line12' class='code' style='background-color: #FFFF3e'> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_numpy);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s_random);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_6, __pyx_n_s_gamma);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
" __pyx_t_6 = <span class='py_c_api'>PyFloat_FromDouble</span>((1.0 / ((__pyx_v_y * __pyx_v_y) + 4.0)));<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
" __pyx_t_7 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_7);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_3);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_7, 0, __pyx_int_3);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_3);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_7, 1, __pyx_t_6);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_6);\n",
" __pyx_t_6 = 0;\n",
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_1, __pyx_t_7, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_7); __pyx_t_7 = 0;\n",
" __pyx_t_8 = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(__pyx_t_6);<span class='error_goto'> if (unlikely((__pyx_t_8 == (double)-1) &amp;&amp; PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
" __pyx_v_x = __pyx_t_8;\n",
"</pre><pre class='line' style='background-color: #FFFF38' onclick='toggleDiv(\"line13\")'> 13: y = numpy.random.normal(1.0 / (x + 1), 1.0 / sqrt(2 * x + 2))</pre>\n",
"<pre id='line13' class='code' style='background-color: #FFFF38'> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_numpy);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
" __pyx_t_7 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_6, __pyx_n_s_random);<span class='error_goto'> if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_7);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_7, __pyx_n_s_normal);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_7); __pyx_t_7 = 0;\n",
" __pyx_t_7 = <span class='py_c_api'>PyFloat_FromDouble</span>((1.0 / (__pyx_v_x + 1.0)));<span class='error_goto'> if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_7);\n",
" __pyx_t_1 = <span class='py_c_api'>PyFloat_FromDouble</span>((1.0 / sqrt(((2.0 * __pyx_v_x) + 2.0))));<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" __pyx_t_9 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_9);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_9, 0, __pyx_t_7);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_7);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_9, 1, __pyx_t_1);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1);\n",
" __pyx_t_7 = 0;\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_6, __pyx_t_9, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_9); __pyx_t_9 = 0;\n",
" __pyx_t_8 = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(__pyx_t_1);<span class='error_goto'> if (unlikely((__pyx_t_8 == (double)-1) &amp;&amp; PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_v_y = __pyx_t_8;\n",
" }\n",
"</pre><pre class='line' style='background-color: #FFFF3f' onclick='toggleDiv(\"line14\")'> 14: out += [[x, y]]</pre>\n",
"<pre id='line14' class='code' style='background-color: #FFFF3f'> __pyx_t_1 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_x);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" __pyx_t_9 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_y);<span class='error_goto'> if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_9);\n",
" __pyx_t_6 = <span class='py_c_api'>PyList_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_6, 0, __pyx_t_1);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_6, 1, __pyx_t_9);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_9);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_9 = 0;\n",
" __pyx_t_9 = <span class='py_c_api'>PyList_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_9);\n",
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_9, 0, __pyx_t_6);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_6);\n",
" __pyx_t_6 = 0;\n",
" __pyx_t_6 = <span class='py_c_api'>PyNumber_InPlaceAdd</span>(__pyx_v_out, __pyx_t_9);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_9); __pyx_t_9 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_v_out, __pyx_t_6);\n",
" __pyx_t_6 = 0;\n",
" }\n",
"</pre><pre class='line' style='background-color: #FFFF5e' onclick='toggleDiv(\"line15\")'> 15: out = numpy.array(out)</pre>\n",
"<pre id='line15' class='code' style='background-color: #FFFF5e'> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_numpy);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
" __pyx_t_9 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_6, __pyx_n_s_array);<span class='error_goto'> if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_9);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
" __pyx_t_6 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_out);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 0, __pyx_v_out);\n",
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_v_out);\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_9, __pyx_t_6, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_9); __pyx_t_9 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_v_out, __pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line16\")'> 16: return(out)</pre>\n",
"<pre id='line16' class='code' style='background-color: #FFFFd4'> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_out);\n",
" __pyx_r = __pyx_v_out;\n",
" goto __pyx_L0;\n",
"</pre></body></html>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 154,
"text": [
"<IPython.core.display.HTML at 0x10d5404d0>"
]
}
],
"prompt_number": 154
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def gibbs1(N=5000, thin=100):\n",
" x=0\n",
" y=0\n",
" out = []\n",
" for i in range(N):\n",
" for j in range(thin):\n",
" x = nr.gamma(3, 1.0 / (y * y + 4))\n",
" y = nr.normal(1.0 / (x + 1), 1.0 / math.sqrt(2 * x + 2)) \n",
" out += [[x, y]]\n",
" out = numpy.array(out)\n",
" return(out)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 155
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"t = time.time()\n",
"out = gibbs()\n",
"print(time.time() - t)\n",
"\n",
"%timeit gibbs1()\n",
"\n",
"t = time.time()\n",
"out1 = gibbs1()\n",
"print(time.time() - t)\n",
"\n",
"%timeit gibbs_cython()\n",
"\n",
"t = time.time()\n",
"out2 = gibbs_cython()\n",
"print(time.time() - t)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"2.900670051574707\n",
"1 loops, best of 3: 659 ms per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"0.6385161876678467"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1 loops, best of 3: 262 ms per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"0.29333996772766113"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 156
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from pylab import *\n",
"figure(1)\n",
"ax = subplot(111)\n",
"df = numpy.hstack([out, out1, out2])\n",
"df = pandas.DataFrame(df)\n",
"p = df.plot(ax=ax, kind='density', alpha=0.5, linewidth=3, style=['-', '--', 'x'] * 2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x10d8a8290>"
]
}
],
"prompt_number": 157
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment