##// END OF EJS Templates
Backport PR #5559: Minor typo fix in "Cython Magics.ipynb"...
MinRK -
Show More
@@ -1,278 +1,278 b''
1 1 {
2 2 "metadata": {
3 3 "name": "Cython Magics"
4 4 },
5 5 "nbformat": 3,
6 6 "nbformat_minor": 0,
7 7 "worksheets": [
8 8 {
9 9 "cells": [
10 10 {
11 11 "cell_type": "heading",
12 12 "level": 1,
13 13 "metadata": {},
14 14 "source": [
15 15 "Cython Magic Functions"
16 16 ]
17 17 },
18 18 {
19 19 "cell_type": "heading",
20 20 "level": 2,
21 21 "metadata": {},
22 22 "source": [
23 23 "Loading the extension"
24 24 ]
25 25 },
26 26 {
27 27 "cell_type": "markdown",
28 28 "metadata": {},
29 29 "source": [
30 "IPtyhon has a `cythonmagic` extension that contains a number of magic functions for working with Cython code. This extension can be loaded using the `%load_ext` magic as follows:"
30 "IPython has a `cythonmagic` extension that contains a number of magic functions for working with Cython code. This extension can be loaded using the `%load_ext` magic as follows:"
31 31 ]
32 32 },
33 33 {
34 34 "cell_type": "code",
35 35 "collapsed": false,
36 36 "input": [
37 37 "%load_ext cythonmagic"
38 38 ],
39 39 "language": "python",
40 40 "metadata": {},
41 41 "outputs": [],
42 42 "prompt_number": 1
43 43 },
44 44 {
45 45 "cell_type": "heading",
46 46 "level": 2,
47 47 "metadata": {},
48 48 "source": [
49 49 "The %cython_inline magic"
50 50 ]
51 51 },
52 52 {
53 53 "cell_type": "markdown",
54 54 "metadata": {},
55 55 "source": [
56 56 "The `%%cython_inline` magic uses `Cython.inline` to compile a Cython expression. This allows you to enter and run a function body with Cython code. Use a bare `return` statement to return values. "
57 57 ]
58 58 },
59 59 {
60 60 "cell_type": "code",
61 61 "collapsed": false,
62 62 "input": [
63 63 "a = 10\n",
64 64 "b = 20"
65 65 ],
66 66 "language": "python",
67 67 "metadata": {},
68 68 "outputs": [],
69 69 "prompt_number": 2
70 70 },
71 71 {
72 72 "cell_type": "code",
73 73 "collapsed": false,
74 74 "input": [
75 75 "%%cython_inline\n",
76 76 "return a+b"
77 77 ],
78 78 "language": "python",
79 79 "metadata": {},
80 80 "outputs": [
81 81 {
82 82 "output_type": "pyout",
83 83 "prompt_number": 3,
84 84 "text": [
85 85 "30"
86 86 ]
87 87 }
88 88 ],
89 89 "prompt_number": 3
90 90 },
91 91 {
92 92 "cell_type": "heading",
93 93 "level": 2,
94 94 "metadata": {},
95 95 "source": [
96 96 "The %cython_pyximport magic"
97 97 ]
98 98 },
99 99 {
100 100 "cell_type": "markdown",
101 101 "metadata": {},
102 102 "source": [
103 103 "The `%%cython_pyximport` magic allows you to enter arbitrary Cython code into a cell. That Cython code is written as a `.pyx` file in the current working directory and then imported using `pyximport`. You have the specify the name of the module that the Code will appear in. All symbols from the module are imported automatically by the magic function."
104 104 ]
105 105 },
106 106 {
107 107 "cell_type": "code",
108 108 "collapsed": false,
109 109 "input": [
110 110 "%%cython_pyximport foo\n",
111 111 "def f(x):\n",
112 112 " return 4.0*x"
113 113 ],
114 114 "language": "python",
115 115 "metadata": {},
116 116 "outputs": [],
117 117 "prompt_number": 4
118 118 },
119 119 {
120 120 "cell_type": "code",
121 121 "collapsed": false,
122 122 "input": [
123 123 "f(10)"
124 124 ],
125 125 "language": "python",
126 126 "metadata": {},
127 127 "outputs": [
128 128 {
129 129 "output_type": "pyout",
130 130 "prompt_number": 5,
131 131 "text": [
132 132 "40.0"
133 133 ]
134 134 }
135 135 ],
136 136 "prompt_number": 5
137 137 },
138 138 {
139 139 "cell_type": "heading",
140 140 "level": 2,
141 141 "metadata": {},
142 142 "source": [
143 143 "The %cython magic"
144 144 ]
145 145 },
146 146 {
147 147 "cell_type": "markdown",
148 148 "metadata": {},
149 149 "source": [
150 150 "Probably the most important magic is the `%cython` magic. This is similar to the `%%cython_pyximport` magic, but doesn't require you to specify a module name. Instead, the `%%cython` magic uses manages everything using temporary files in the `~/.cython/magic` directory. All of the symbols in the Cython module are imported automatically by the magic.\n",
151 151 "\n",
152 152 "Here is a simple example of a Black-Scholes options pricing algorithm written in Cython. Please note that this example might not compile on non-POSIX systems (e.g., Windows) because of a missing `erf` symbol."
153 153 ]
154 154 },
155 155 {
156 156 "cell_type": "code",
157 157 "collapsed": false,
158 158 "input": [
159 159 "%%cython\n",
160 160 "cimport cython\n",
161 161 "from libc.math cimport exp, sqrt, pow, log, erf\n",
162 162 "\n",
163 163 "@cython.cdivision(True)\n",
164 164 "cdef double std_norm_cdf(double x) nogil:\n",
165 165 " return 0.5*(1+erf(x/sqrt(2.0)))\n",
166 166 "\n",
167 167 "@cython.cdivision(True)\n",
168 168 "def black_scholes(double s, double k, double t, double v,\n",
169 169 " double rf, double div, double cp):\n",
170 170 " \"\"\"Price an option using the Black-Scholes model.\n",
171 171 " \n",
172 172 " s : initial stock price\n",
173 173 " k : strike price\n",
174 174 " t : expiration time\n",
175 175 " v : volatility\n",
176 176 " rf : risk-free rate\n",
177 177 " div : dividend\n",
178 178 " cp : +1/-1 for call/put\n",
179 179 " \"\"\"\n",
180 180 " cdef double d1, d2, optprice\n",
181 181 " with nogil:\n",
182 182 " d1 = (log(s/k)+(rf-div+0.5*pow(v,2))*t)/(v*sqrt(t))\n",
183 183 " d2 = d1 - v*sqrt(t)\n",
184 184 " optprice = cp*s*exp(-div*t)*std_norm_cdf(cp*d1) - \\\n",
185 185 " cp*k*exp(-rf*t)*std_norm_cdf(cp*d2)\n",
186 186 " return optprice"
187 187 ],
188 188 "language": "python",
189 189 "metadata": {},
190 190 "outputs": [],
191 191 "prompt_number": 6
192 192 },
193 193 {
194 194 "cell_type": "code",
195 195 "collapsed": false,
196 196 "input": [
197 197 "black_scholes(100.0, 100.0, 1.0, 0.3, 0.03, 0.0, -1)"
198 198 ],
199 199 "language": "python",
200 200 "metadata": {},
201 201 "outputs": [
202 202 {
203 203 "output_type": "pyout",
204 204 "prompt_number": 7,
205 205 "text": [
206 206 "10.327861752731728"
207 207 ]
208 208 }
209 209 ],
210 210 "prompt_number": 7
211 211 },
212 212 {
213 213 "cell_type": "code",
214 214 "collapsed": false,
215 215 "input": [
216 216 "%timeit black_scholes(100.0, 100.0, 1.0, 0.3, 0.03, 0.0, -1)"
217 217 ],
218 218 "language": "python",
219 219 "metadata": {},
220 220 "outputs": [
221 221 {
222 222 "output_type": "stream",
223 223 "stream": "stdout",
224 224 "text": [
225 225 "1000000 loops, best of 3: 821 ns per loop\n"
226 226 ]
227 227 }
228 228 ],
229 229 "prompt_number": 8
230 230 },
231 231 {
232 232 "cell_type": "heading",
233 233 "level": 2,
234 234 "metadata": {},
235 235 "source": [
236 236 "External libraries"
237 237 ]
238 238 },
239 239 {
240 240 "cell_type": "markdown",
241 241 "metadata": {},
242 242 "source": [
243 243 "Cython allows you to specify additional libraries to be linked with your extension, you can do so with the `-l` flag (also spelled `--lib`). Note that this flag can be passed more than once to specify multiple libraries, such as `-lm -llib2 --lib lib3`. Here's a simple example of how to access the system math library:"
244 244 ]
245 245 },
246 246 {
247 247 "cell_type": "code",
248 248 "collapsed": false,
249 249 "input": [
250 250 "%%cython -lm\n",
251 251 "from libc.math cimport sin\n",
252 252 "print 'sin(1)=', sin(1)"
253 253 ],
254 254 "language": "python",
255 255 "metadata": {},
256 256 "outputs": [
257 257 {
258 258 "output_type": "stream",
259 259 "stream": "stdout",
260 260 "text": [
261 261 "sin(1)= 0.841470984808\n"
262 262 ]
263 263 }
264 264 ],
265 265 "prompt_number": 9
266 266 },
267 267 {
268 268 "cell_type": "markdown",
269 269 "metadata": {},
270 270 "source": [
271 271 "You can similarly use the `-I/--include` flag to add include directories to the search path, and `-c/--compile-args` to add extra flags that are passed to Cython via the `extra_compile_args` of the distutils `Extension` class. Please see [the Cython docs on C library usage](http://docs.cython.org/src/tutorial/clibraries.html) for more details on the use of these flags."
272 272 ]
273 273 }
274 274 ],
275 275 "metadata": {}
276 276 }
277 277 ]
278 278 }
General Comments 0
You need to be logged in to leave comments. Login now