From 71024d35783da4d2165729d316dff36dbdfd0fad Mon Sep 17 00:00:00 2001 From: James Fergusson <j.fergusson@DAMTP.cam.ac.uk> Date: Thu, 22 Nov 2018 12:31:25 +0000 Subject: [PATCH] typos in 9 --- 9_Cython.ipynb | 1103 ++++-------------------------------------------- 1 file changed, 92 insertions(+), 1011 deletions(-) diff --git a/9_Cython.ipynb b/9_Cython.ipynb index cd1fe89..25a9ea4 100644 --- a/9_Cython.ipynb +++ b/9_Cython.ipynb @@ -84,7 +84,9 @@ "source": [ "So just adding `%%cython` gives us a factor ~2x speedup. But if we simply add types to our variables with `cdef` this increases to a ~240x speed up!\n", "\n", - "This is because the function is dominated by the loop which C can do much better. The `%%cython` magic actually does something tricky in the background. It takes the cell and converts it to C code then compiles it and stores the resulting executable in a temporary location. We will come back to compilation later but let's look at the difference between writing cython and python code:\n", + "This is because the function is dominated by the loop which C can do much better. The `%%cython` magic actually does something tricky in the background. It takes the cell and converts it to C code then compiles it and stores the resulting executable in a temporary location. We can see the actuall C code generated using the annotate option by adding `-a` after the `%%cython`. This gives us a window to how the code has been converted to C with highlighting to show how much python interaction is left for each line. If we click the little '+' on the line number it shows you what this line has been converted to in C and the stronger the yellow the more python interation remains.\n", + "\n", + "We will come back to compilation later but let's look at the difference between writing cython and python code:\n", "\n", "1. We don't have to do anything to cython-ise most python code. We can put almost any python code through the cython compiler and it will work fine and usually run faster.\n", "\n", @@ -92,7 +94,7 @@ "\n", "3. In cython we can now use all C libraries and easily access threaded parallelisim by avoiding the GIL.\n", "\n", - "So we see that there are very few differences. Cython is a superset of python so we don't have to change anything if we don't want to. As cython is effectivly an optimisation tool we should profile the code and only cythonise the slowest parts. This is the main advantage. If you wanted to access the speed of C you would otherwise have to re-write all your code in C where lots of things can be significantly more difficult. Instead we can use the convenience of python for most of the code and only invoke C in the sections where performance is most important. We can see how well we are doing by using the annotate option by adding `-a` after the `%%cython` This gives us a window to how the code has been converted to C.\n", + "So we see that there are very few differences. Cython is a superset of python so we don't have to change anything if we don't want to. As cython is effectivly an optimisation tool we should profile the code and only cythonise the slowest parts. This is the main advantage. If you wanted to access the speed of C you would otherwise have to re-write all your code in C where lots of things can be significantly more difficult. Instead we can use the convenience of python for most of the code and only invoke C in the sections where performance is most important.\n", "\n", "## Types\n", "Using cython is it's basic form is pretty easy. Let's look at the cdef statement a bit more. Here are the following basic cdef types:" @@ -389,8 +391,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This generates a `.html` file which shows us how much of our code has been converted to C. If we click the little '+' on the line number it shows you what this line has been converted to in C and it colours yellow any lines which still have python interations. It should have highlighted two lines the `def fib3()` line and the `return a` line. This is because we haven't specified what type the function should return. We can correct this by changing the definition to:\n", - "`cpdef int fib3()`. Now when we re-compile the `return` line is white and the `def` line is paler yellow. This can't be changed as we want the function to be available in python so it must interact with it.\n", + "This generates a `.html` file which shows us how much of our code has been converted to C. It should have highlighted two lines the `def fib3()` line and the `return a` line. This is because we haven't specified what type the function should return. We can correct this by changing the definition to: `cpdef int fib3()`. Now when we re-compile the `return` line is white and the `def` line is paler yellow. This can't be changed as we want the function to be available in python so it must interact with it.\n", "\n", "## Extensions\n", "Now we have access to all of the functionallity of C and C++. This is a massive topic and I couldn't begin to address it here. There are however a couple of options I will flag up for you to think about in future\n", @@ -411,1046 +412,126 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 13, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<!DOCTYPE html>\n", - "<!-- Generated by Cython 0.29 -->\n", - "<html>\n", - "<head>\n", - " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", - " <title>Cython: _cython_magic_325a2202a289f660cca96bd133cb80f7.pyx</title>\n", - " <style type=\"text/css\">\n", - " \n", - "body.cython { font-family: courier; font-size: 12; }\n", - "\n", - ".cython.tag { }\n", - ".cython.line { margin: 0em }\n", - ".cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }\n", - "\n", - ".cython.line .run { background-color: #B0FFB0; }\n", - ".cython.line .mis { background-color: #FFB0B0; }\n", - ".cython.code.run { border-left: 8px solid #B0FFB0; }\n", - ".cython.code.mis { border-left: 8px solid #FFB0B0; }\n", - "\n", - ".cython.code .py_c_api { color: red; }\n", - ".cython.code .py_macro_api { color: #FF7000; }\n", - ".cython.code .pyx_c_api { color: #FF3000; }\n", - ".cython.code .pyx_macro_api { color: #FF7000; }\n", - ".cython.code .refnanny { color: #FFA000; }\n", - ".cython.code .trace { color: #FFA000; }\n", - ".cython.code .error_goto { color: #FFA000; }\n", - "\n", - ".cython.code .coerce { color: #008000; border: 1px dotted #008000 }\n", - ".cython.code .py_attr { color: #FF0000; font-weight: bold; }\n", - ".cython.code .c_attr { color: #0000FF; }\n", - ".cython.code .py_call { color: #FF0000; font-weight: bold; }\n", - ".cython.code .c_call { color: #0000FF; }\n", - "\n", - ".cython.score-0 {background-color: #FFFFff;}\n", - ".cython.score-1 {background-color: #FFFFe7;}\n", - ".cython.score-2 {background-color: #FFFFd4;}\n", - ".cython.score-3 {background-color: #FFFFc4;}\n", - ".cython.score-4 {background-color: #FFFFb6;}\n", - ".cython.score-5 {background-color: #FFFFaa;}\n", - ".cython.score-6 {background-color: #FFFF9f;}\n", - ".cython.score-7 {background-color: #FFFF96;}\n", - ".cython.score-8 {background-color: #FFFF8d;}\n", - ".cython.score-9 {background-color: #FFFF86;}\n", - ".cython.score-10 {background-color: #FFFF7f;}\n", - ".cython.score-11 {background-color: #FFFF79;}\n", - ".cython.score-12 {background-color: #FFFF73;}\n", - ".cython.score-13 {background-color: #FFFF6e;}\n", - ".cython.score-14 {background-color: #FFFF6a;}\n", - ".cython.score-15 {background-color: #FFFF66;}\n", - ".cython.score-16 {background-color: #FFFF62;}\n", - ".cython.score-17 {background-color: #FFFF5e;}\n", - ".cython.score-18 {background-color: #FFFF5b;}\n", - ".cython.score-19 {background-color: #FFFF57;}\n", - ".cython.score-20 {background-color: #FFFF55;}\n", - ".cython.score-21 {background-color: #FFFF52;}\n", - ".cython.score-22 {background-color: #FFFF4f;}\n", - ".cython.score-23 {background-color: #FFFF4d;}\n", - ".cython.score-24 {background-color: #FFFF4b;}\n", - ".cython.score-25 {background-color: #FFFF48;}\n", - ".cython.score-26 {background-color: #FFFF46;}\n", - ".cython.score-27 {background-color: #FFFF44;}\n", - ".cython.score-28 {background-color: #FFFF43;}\n", - ".cython.score-29 {background-color: #FFFF41;}\n", - ".cython.score-30 {background-color: #FFFF3f;}\n", - ".cython.score-31 {background-color: #FFFF3e;}\n", - ".cython.score-32 {background-color: #FFFF3c;}\n", - ".cython.score-33 {background-color: #FFFF3b;}\n", - ".cython.score-34 {background-color: #FFFF39;}\n", - ".cython.score-35 {background-color: #FFFF38;}\n", - ".cython.score-36 {background-color: #FFFF37;}\n", - ".cython.score-37 {background-color: #FFFF36;}\n", - ".cython.score-38 {background-color: #FFFF35;}\n", - ".cython.score-39 {background-color: #FFFF34;}\n", - ".cython.score-40 {background-color: #FFFF33;}\n", - ".cython.score-41 {background-color: #FFFF32;}\n", - ".cython.score-42 {background-color: #FFFF31;}\n", - ".cython.score-43 {background-color: #FFFF30;}\n", - ".cython.score-44 {background-color: #FFFF2f;}\n", - ".cython.score-45 {background-color: #FFFF2e;}\n", - ".cython.score-46 {background-color: #FFFF2d;}\n", - ".cython.score-47 {background-color: #FFFF2c;}\n", - ".cython.score-48 {background-color: #FFFF2b;}\n", - ".cython.score-49 {background-color: #FFFF2b;}\n", - ".cython.score-50 {background-color: #FFFF2a;}\n", - ".cython.score-51 {background-color: #FFFF29;}\n", - ".cython.score-52 {background-color: #FFFF29;}\n", - ".cython.score-53 {background-color: #FFFF28;}\n", - ".cython.score-54 {background-color: #FFFF27;}\n", - ".cython.score-55 {background-color: #FFFF27;}\n", - ".cython.score-56 {background-color: #FFFF26;}\n", - ".cython.score-57 {background-color: #FFFF26;}\n", - ".cython.score-58 {background-color: #FFFF25;}\n", - ".cython.score-59 {background-color: #FFFF24;}\n", - ".cython.score-60 {background-color: #FFFF24;}\n", - ".cython.score-61 {background-color: #FFFF23;}\n", - ".cython.score-62 {background-color: #FFFF23;}\n", - ".cython.score-63 {background-color: #FFFF22;}\n", - ".cython.score-64 {background-color: #FFFF22;}\n", - ".cython.score-65 {background-color: #FFFF22;}\n", - ".cython.score-66 {background-color: #FFFF21;}\n", - ".cython.score-67 {background-color: #FFFF21;}\n", - ".cython.score-68 {background-color: #FFFF20;}\n", - ".cython.score-69 {background-color: #FFFF20;}\n", - ".cython.score-70 {background-color: #FFFF1f;}\n", - ".cython.score-71 {background-color: #FFFF1f;}\n", - ".cython.score-72 {background-color: #FFFF1f;}\n", - ".cython.score-73 {background-color: #FFFF1e;}\n", - ".cython.score-74 {background-color: #FFFF1e;}\n", - ".cython.score-75 {background-color: #FFFF1e;}\n", - ".cython.score-76 {background-color: #FFFF1d;}\n", - ".cython.score-77 {background-color: #FFFF1d;}\n", - ".cython.score-78 {background-color: #FFFF1c;}\n", - ".cython.score-79 {background-color: #FFFF1c;}\n", - ".cython.score-80 {background-color: #FFFF1c;}\n", - ".cython.score-81 {background-color: #FFFF1c;}\n", - ".cython.score-82 {background-color: #FFFF1b;}\n", - ".cython.score-83 {background-color: #FFFF1b;}\n", - ".cython.score-84 {background-color: #FFFF1b;}\n", - ".cython.score-85 {background-color: #FFFF1a;}\n", - ".cython.score-86 {background-color: #FFFF1a;}\n", - ".cython.score-87 {background-color: #FFFF1a;}\n", - ".cython.score-88 {background-color: #FFFF1a;}\n", - ".cython.score-89 {background-color: #FFFF19;}\n", - ".cython.score-90 {background-color: #FFFF19;}\n", - ".cython.score-91 {background-color: #FFFF19;}\n", - ".cython.score-92 {background-color: #FFFF19;}\n", - ".cython.score-93 {background-color: #FFFF18;}\n", - ".cython.score-94 {background-color: #FFFF18;}\n", - ".cython.score-95 {background-color: #FFFF18;}\n", - ".cython.score-96 {background-color: #FFFF18;}\n", - ".cython.score-97 {background-color: #FFFF17;}\n", - ".cython.score-98 {background-color: #FFFF17;}\n", - ".cython.score-99 {background-color: #FFFF17;}\n", - ".cython.score-100 {background-color: #FFFF17;}\n", - ".cython.score-101 {background-color: #FFFF16;}\n", - ".cython.score-102 {background-color: #FFFF16;}\n", - ".cython.score-103 {background-color: #FFFF16;}\n", - ".cython.score-104 {background-color: #FFFF16;}\n", - ".cython.score-105 {background-color: #FFFF16;}\n", - ".cython.score-106 {background-color: #FFFF15;}\n", - ".cython.score-107 {background-color: #FFFF15;}\n", - ".cython.score-108 {background-color: #FFFF15;}\n", - ".cython.score-109 {background-color: #FFFF15;}\n", - ".cython.score-110 {background-color: #FFFF15;}\n", - ".cython.score-111 {background-color: #FFFF15;}\n", - ".cython.score-112 {background-color: #FFFF14;}\n", - ".cython.score-113 {background-color: #FFFF14;}\n", - ".cython.score-114 {background-color: #FFFF14;}\n", - ".cython.score-115 {background-color: #FFFF14;}\n", - ".cython.score-116 {background-color: #FFFF14;}\n", - ".cython.score-117 {background-color: #FFFF14;}\n", - ".cython.score-118 {background-color: #FFFF13;}\n", - ".cython.score-119 {background-color: #FFFF13;}\n", - ".cython.score-120 {background-color: #FFFF13;}\n", - ".cython.score-121 {background-color: #FFFF13;}\n", - ".cython.score-122 {background-color: #FFFF13;}\n", - ".cython.score-123 {background-color: #FFFF13;}\n", - ".cython.score-124 {background-color: #FFFF13;}\n", - ".cython.score-125 {background-color: #FFFF12;}\n", - ".cython.score-126 {background-color: #FFFF12;}\n", - ".cython.score-127 {background-color: #FFFF12;}\n", - ".cython.score-128 {background-color: #FFFF12;}\n", - ".cython.score-129 {background-color: #FFFF12;}\n", - ".cython.score-130 {background-color: #FFFF12;}\n", - ".cython.score-131 {background-color: #FFFF12;}\n", - ".cython.score-132 {background-color: #FFFF11;}\n", - ".cython.score-133 {background-color: #FFFF11;}\n", - ".cython.score-134 {background-color: #FFFF11;}\n", - ".cython.score-135 {background-color: #FFFF11;}\n", - ".cython.score-136 {background-color: #FFFF11;}\n", - ".cython.score-137 {background-color: #FFFF11;}\n", - ".cython.score-138 {background-color: #FFFF11;}\n", - ".cython.score-139 {background-color: #FFFF11;}\n", - ".cython.score-140 {background-color: #FFFF11;}\n", - ".cython.score-141 {background-color: #FFFF10;}\n", - ".cython.score-142 {background-color: #FFFF10;}\n", - ".cython.score-143 {background-color: #FFFF10;}\n", - ".cython.score-144 {background-color: #FFFF10;}\n", - ".cython.score-145 {background-color: #FFFF10;}\n", - ".cython.score-146 {background-color: #FFFF10;}\n", - ".cython.score-147 {background-color: #FFFF10;}\n", - ".cython.score-148 {background-color: #FFFF10;}\n", - ".cython.score-149 {background-color: #FFFF10;}\n", - ".cython.score-150 {background-color: #FFFF0f;}\n", - ".cython.score-151 {background-color: #FFFF0f;}\n", - ".cython.score-152 {background-color: #FFFF0f;}\n", - ".cython.score-153 {background-color: #FFFF0f;}\n", - ".cython.score-154 {background-color: #FFFF0f;}\n", - ".cython.score-155 {background-color: #FFFF0f;}\n", - ".cython.score-156 {background-color: #FFFF0f;}\n", - ".cython.score-157 {background-color: #FFFF0f;}\n", - ".cython.score-158 {background-color: #FFFF0f;}\n", - ".cython.score-159 {background-color: #FFFF0f;}\n", - ".cython.score-160 {background-color: #FFFF0f;}\n", - ".cython.score-161 {background-color: #FFFF0e;}\n", - ".cython.score-162 {background-color: #FFFF0e;}\n", - ".cython.score-163 {background-color: #FFFF0e;}\n", - ".cython.score-164 {background-color: #FFFF0e;}\n", - ".cython.score-165 {background-color: #FFFF0e;}\n", - ".cython.score-166 {background-color: #FFFF0e;}\n", - ".cython.score-167 {background-color: #FFFF0e;}\n", - ".cython.score-168 {background-color: #FFFF0e;}\n", - ".cython.score-169 {background-color: #FFFF0e;}\n", - ".cython.score-170 {background-color: #FFFF0e;}\n", - ".cython.score-171 {background-color: #FFFF0e;}\n", - ".cython.score-172 {background-color: #FFFF0e;}\n", - ".cython.score-173 {background-color: #FFFF0d;}\n", - ".cython.score-174 {background-color: #FFFF0d;}\n", - ".cython.score-175 {background-color: #FFFF0d;}\n", - ".cython.score-176 {background-color: #FFFF0d;}\n", - ".cython.score-177 {background-color: #FFFF0d;}\n", - ".cython.score-178 {background-color: #FFFF0d;}\n", - ".cython.score-179 {background-color: #FFFF0d;}\n", - ".cython.score-180 {background-color: #FFFF0d;}\n", - ".cython.score-181 {background-color: #FFFF0d;}\n", - ".cython.score-182 {background-color: #FFFF0d;}\n", - ".cython.score-183 {background-color: #FFFF0d;}\n", - ".cython.score-184 {background-color: #FFFF0d;}\n", - ".cython.score-185 {background-color: #FFFF0d;}\n", - ".cython.score-186 {background-color: #FFFF0d;}\n", - ".cython.score-187 {background-color: #FFFF0c;}\n", - ".cython.score-188 {background-color: #FFFF0c;}\n", - ".cython.score-189 {background-color: #FFFF0c;}\n", - ".cython.score-190 {background-color: #FFFF0c;}\n", - ".cython.score-191 {background-color: #FFFF0c;}\n", - ".cython.score-192 {background-color: #FFFF0c;}\n", - ".cython.score-193 {background-color: #FFFF0c;}\n", - ".cython.score-194 {background-color: #FFFF0c;}\n", - ".cython.score-195 {background-color: #FFFF0c;}\n", - ".cython.score-196 {background-color: #FFFF0c;}\n", - ".cython.score-197 {background-color: #FFFF0c;}\n", - ".cython.score-198 {background-color: #FFFF0c;}\n", - ".cython.score-199 {background-color: #FFFF0c;}\n", - ".cython.score-200 {background-color: #FFFF0c;}\n", - ".cython.score-201 {background-color: #FFFF0c;}\n", - ".cython.score-202 {background-color: #FFFF0c;}\n", - ".cython.score-203 {background-color: #FFFF0b;}\n", - ".cython.score-204 {background-color: #FFFF0b;}\n", - ".cython.score-205 {background-color: #FFFF0b;}\n", - ".cython.score-206 {background-color: #FFFF0b;}\n", - ".cython.score-207 {background-color: #FFFF0b;}\n", - ".cython.score-208 {background-color: #FFFF0b;}\n", - ".cython.score-209 {background-color: #FFFF0b;}\n", - ".cython.score-210 {background-color: #FFFF0b;}\n", - ".cython.score-211 {background-color: #FFFF0b;}\n", - ".cython.score-212 {background-color: #FFFF0b;}\n", - ".cython.score-213 {background-color: #FFFF0b;}\n", - ".cython.score-214 {background-color: #FFFF0b;}\n", - ".cython.score-215 {background-color: #FFFF0b;}\n", - ".cython.score-216 {background-color: #FFFF0b;}\n", - ".cython.score-217 {background-color: #FFFF0b;}\n", - ".cython.score-218 {background-color: #FFFF0b;}\n", - ".cython.score-219 {background-color: #FFFF0b;}\n", - ".cython.score-220 {background-color: #FFFF0b;}\n", - ".cython.score-221 {background-color: #FFFF0b;}\n", - ".cython.score-222 {background-color: #FFFF0a;}\n", - ".cython.score-223 {background-color: #FFFF0a;}\n", - ".cython.score-224 {background-color: #FFFF0a;}\n", - ".cython.score-225 {background-color: #FFFF0a;}\n", - ".cython.score-226 {background-color: #FFFF0a;}\n", - ".cython.score-227 {background-color: #FFFF0a;}\n", - ".cython.score-228 {background-color: #FFFF0a;}\n", - ".cython.score-229 {background-color: #FFFF0a;}\n", - ".cython.score-230 {background-color: #FFFF0a;}\n", - ".cython.score-231 {background-color: #FFFF0a;}\n", - ".cython.score-232 {background-color: #FFFF0a;}\n", - ".cython.score-233 {background-color: #FFFF0a;}\n", - ".cython.score-234 {background-color: #FFFF0a;}\n", - ".cython.score-235 {background-color: #FFFF0a;}\n", - ".cython.score-236 {background-color: #FFFF0a;}\n", - ".cython.score-237 {background-color: #FFFF0a;}\n", - ".cython.score-238 {background-color: #FFFF0a;}\n", - ".cython.score-239 {background-color: #FFFF0a;}\n", - ".cython.score-240 {background-color: #FFFF0a;}\n", - ".cython.score-241 {background-color: #FFFF0a;}\n", - ".cython.score-242 {background-color: #FFFF0a;}\n", - ".cython.score-243 {background-color: #FFFF0a;}\n", - ".cython.score-244 {background-color: #FFFF0a;}\n", - ".cython.score-245 {background-color: #FFFF0a;}\n", - ".cython.score-246 {background-color: #FFFF09;}\n", - ".cython.score-247 {background-color: #FFFF09;}\n", - ".cython.score-248 {background-color: #FFFF09;}\n", - ".cython.score-249 {background-color: #FFFF09;}\n", - ".cython.score-250 {background-color: #FFFF09;}\n", - ".cython.score-251 {background-color: #FFFF09;}\n", - ".cython.score-252 {background-color: #FFFF09;}\n", - ".cython.score-253 {background-color: #FFFF09;}\n", - ".cython.score-254 {background-color: #FFFF09;}\n", - ".cython .hll { background-color: #ffffcc }\n", - ".cython { background: #f8f8f8; }\n", - ".cython .c { color: #408080; font-style: italic } /* Comment */\n", - ".cython .err { border: 1px solid #FF0000 } /* Error */\n", - ".cython .k { color: #008000; font-weight: bold } /* Keyword */\n", - ".cython .o { color: #666666 } /* Operator */\n", - ".cython .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n", - ".cython .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n", - ".cython .cp { color: #BC7A00 } /* Comment.Preproc */\n", - ".cython .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n", - ".cython .c1 { color: #408080; font-style: italic } /* Comment.Single */\n", - ".cython .cs { color: #408080; font-style: italic } /* Comment.Special */\n", - ".cython .gd { color: #A00000 } /* Generic.Deleted */\n", - ".cython .ge { font-style: italic } /* Generic.Emph */\n", - ".cython .gr { color: #FF0000 } /* Generic.Error */\n", - ".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", - ".cython .gi { color: #00A000 } /* Generic.Inserted */\n", - ".cython .go { color: #888888 } /* Generic.Output */\n", - ".cython .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n", - ".cython .gs { font-weight: bold } /* Generic.Strong */\n", - ".cython .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n", - ".cython .gt { color: #0044DD } /* Generic.Traceback */\n", - ".cython .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n", - ".cython .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n", - ".cython .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n", - ".cython .kp { color: #008000 } /* Keyword.Pseudo */\n", - ".cython .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n", - ".cython .kt { color: #B00040 } /* Keyword.Type */\n", - ".cython .m { color: #666666 } /* Literal.Number */\n", - ".cython .s { color: #BA2121 } /* Literal.String */\n", - ".cython .na { color: #7D9029 } /* Name.Attribute */\n", - ".cython .nb { color: #008000 } /* Name.Builtin */\n", - ".cython .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n", - ".cython .no { color: #880000 } /* Name.Constant */\n", - ".cython .nd { color: #AA22FF } /* Name.Decorator */\n", - ".cython .ni { color: #999999; font-weight: bold } /* Name.Entity */\n", - ".cython .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n", - ".cython .nf { color: #0000FF } /* Name.Function */\n", - ".cython .nl { color: #A0A000 } /* Name.Label */\n", - ".cython .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n", - ".cython .nt { color: #008000; font-weight: bold } /* Name.Tag */\n", - ".cython .nv { color: #19177C } /* Name.Variable */\n", - ".cython .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n", - ".cython .w { color: #bbbbbb } /* Text.Whitespace */\n", - ".cython .mb { color: #666666 } /* Literal.Number.Bin */\n", - ".cython .mf { color: #666666 } /* Literal.Number.Float */\n", - ".cython .mh { color: #666666 } /* Literal.Number.Hex */\n", - ".cython .mi { color: #666666 } /* Literal.Number.Integer */\n", - ".cython .mo { color: #666666 } /* Literal.Number.Oct */\n", - ".cython .sa { color: #BA2121 } /* Literal.String.Affix */\n", - ".cython .sb { color: #BA2121 } /* Literal.String.Backtick */\n", - ".cython .sc { color: #BA2121 } /* Literal.String.Char */\n", - ".cython .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", - ".cython .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", - ".cython .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".cython .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n", - ".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".cython .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n", - ".cython .sx { color: #008000 } /* Literal.String.Other */\n", - ".cython .sr { color: #BB6688 } /* Literal.String.Regex */\n", - ".cython .s1 { color: #BA2121 } /* Literal.String.Single */\n", - ".cython .ss { color: #19177C } /* Literal.String.Symbol */\n", - ".cython .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", - ".cython .fm { color: #0000FF } /* Name.Function.Magic */\n", - ".cython .vc { color: #19177C } /* Name.Variable.Class */\n", - ".cython .vg { color: #19177C } /* Name.Variable.Global */\n", - ".cython .vi { color: #19177C } /* Name.Variable.Instance */\n", - ".cython .vm { color: #19177C } /* Name.Variable.Magic */\n", - ".cython .il { color: #666666 } /* Literal.Number.Integer.Long */\n", - " </style>\n", - "</head>\n", - "<body class=\"cython\">\n", - "<p><span style=\"border-bottom: solid 1px grey;\">Generated by Cython 0.29</span></p>\n", - "<p>\n", - " <span style=\"background-color: #FFFF00\">Yellow lines</span> hint at Python interaction.<br />\n", - " Click on a line that starts with a \"<code>+</code>\" to see the C code that Cython generated for it.\n", - "</p>\n", - "<div class=\"cython\"><pre class=\"cython line score-16\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">1</span>: <span class=\"k\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n", - "<pre class='cython code score-16 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_numpy, 0, 0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __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_np, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 1, __pyx_L1_error)</span>\n", - " <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", - "/* … */\n", - " __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyDict_NewPresized</span>(0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __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) < 0) <span class='error_goto'>__PYX_ERR(0, 1, __pyx_L1_error)</span>\n", - " <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", - "</pre><pre class=\"cython line score-0\"> <span class=\"\">2</span>: <span class=\"k\">cimport</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">cnp</span></pre>\n", - "<pre class=\"cython line score-0\"> <span class=\"\">3</span>: </pre>\n", - "<pre class=\"cython line score-18\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">4</span>: <span class=\"k\">cpdef</span> <span class=\"kt\">double</span> <span class=\"nf\">loop1</span><span class=\"p\">(</span><span class=\"nb\">int</span> <span class=\"n\">N</span><span class=\"p\">):</span></pre>\n", - "<pre class='cython code score-18 '>static PyObject *__pyx_pw_46_cython_magic_325a2202a289f660cca96bd133cb80f7_1loop1(PyObject *__pyx_self, PyObject *__pyx_arg_N); /*proto*/\n", - "static double __pyx_f_46_cython_magic_325a2202a289f660cca96bd133cb80f7_loop1(int __pyx_v_N, CYTHON_UNUSED int __pyx_skip_dispatch) {\n", - " int __pyx_v_i;\n", - " int __pyx_v_out;\n", - " double __pyx_r;\n", - " <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", - " <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"loop1\", 0);\n", - "/* … */\n", - " /* function exit code */\n", - " __pyx_L0:;\n", - " <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", - " return __pyx_r;\n", - "}\n", - "\n", - "/* Python wrapper */\n", - "static PyObject *__pyx_pw_46_cython_magic_325a2202a289f660cca96bd133cb80f7_1loop1(PyObject *__pyx_self, PyObject *__pyx_arg_N); /*proto*/\n", - "static PyObject *__pyx_pw_46_cython_magic_325a2202a289f660cca96bd133cb80f7_1loop1(PyObject *__pyx_self, PyObject *__pyx_arg_N) {\n", - " int __pyx_v_N;\n", - " PyObject *__pyx_r = 0;\n", - " <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", - " <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"loop1 (wrapper)\", 0);\n", - " assert(__pyx_arg_N); {\n", - " __pyx_v_N = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_arg_N); if (unlikely((__pyx_v_N == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 4, __pyx_L3_error)</span>\n", - " }\n", - " goto __pyx_L4_argument_unpacking_done;\n", - " __pyx_L3_error:;\n", - " <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_325a2202a289f660cca96bd133cb80f7.loop1\", __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_325a2202a289f660cca96bd133cb80f7_loop1(__pyx_self, ((int)__pyx_v_N));\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_325a2202a289f660cca96bd133cb80f7_loop1(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_N) {\n", - " PyObject *__pyx_r = NULL;\n", - " <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", - " <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"loop1\", 0);\n", - " <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", - " __pyx_t_1 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_f_46_cython_magic_325a2202a289f660cca96bd133cb80f7_loop1(__pyx_v_N, 0));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error)</span>\n", - " <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", - " __pyx_r = __pyx_t_1;\n", - " __pyx_t_1 = 0;\n", - " goto __pyx_L0;\n", - "\n", - " /* function exit code */\n", - " __pyx_L1_error:;\n", - " <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n", - " <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_325a2202a289f660cca96bd133cb80f7.loop1\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", - " __pyx_r = NULL;\n", - " __pyx_L0:;\n", - " <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", - " <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", - " return __pyx_r;\n", - "}\n", - "</pre><pre class=\"cython line score-0\"> <span class=\"\">5</span>: <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">i</span></pre>\n", - "<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">6</span>: <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">out</span> <span class=\"o\">=</span> <span class=\"mf\">0</span></pre>\n", - "<pre class='cython code score-0 '> __pyx_v_out = 0;\n", - "</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">7</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">N</span><span class=\"p\">):</span></pre>\n", - "<pre class='cython code score-0 '> __pyx_t_1 = __pyx_v_N;\n", - " __pyx_t_2 = __pyx_t_1;\n", - " for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {\n", - " __pyx_v_i = __pyx_t_3;\n", - "</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">8</span>: <span class=\"n\">out</span><span class=\"o\">+=</span><span class=\"n\">i</span></pre>\n", - "<pre class='cython code score-0 '> __pyx_v_out = (__pyx_v_out + __pyx_v_i);\n", - " }\n", - "</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">9</span>: <span class=\"k\">return</span> <span class=\"n\">out</span></pre>\n", - "<pre class='cython code score-0 '> __pyx_r = __pyx_v_out;\n", - " goto __pyx_L0;\n", - "</pre></div></body></html>" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "%%cython -a\n", + "%%cython\n", "import numpy as np\n", "cimport numpy as cnp\n", + "from cython.parallel import prange\n", + "import cython\n", "\n", - "cpdef double loop1(int N):\n", + "@cython.cdivision(True)\n", + "@cython.boundscheck(False)\n", + "cpdef cnp.ndarray[cnp.int_t, ndim=1] func1(cnp.ndarray[cnp.double_t, ndim=1] Xin):\n", " cdef int i\n", - " cdef int out = 0\n", + " cdef int N = Xin.shape[0]\n", + " cdef cnp.ndarray[cnp.double_t, ndim=1] Xout = np.empty_like(Xin)\n", + " \n", " for i in range(N):\n", - " out+=i\n", - " return out" + " Xout[i] = 1e0/Xin[i]\n", + " \n", + " return Xout\n", + "\n", + "@cython.cdivision(True)\n", + "@cython.boundscheck(False)\n", + "cpdef cnp.ndarray[cnp.int_t, ndim=1] func2(cnp.ndarray[cnp.double_t, ndim=1] Xin):\n", + " cdef int i\n", + " cdef int N = Xin.shape[0]\n", + " cdef cnp.ndarray[cnp.double_t, ndim=1] Xout = np.empty_like(Xin)\n", + " \n", + " for i in prange(N, nogil=True):\n", + " Xout[i] = 1e0/Xin[i]\n", + " \n", + " return Xout" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 14, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "<!DOCTYPE html>\n", - "<!-- Generated by Cython 0.29 -->\n", - "<html>\n", - "<head>\n", - " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", - " <title>Cython: _cython_magic_86cb9b709227623179295619ed95fbfe.pyx</title>\n", - " <style type=\"text/css\">\n", - " \n", - "body.cython { font-family: courier; font-size: 12; }\n", - "\n", - ".cython.tag { }\n", - ".cython.line { margin: 0em }\n", - ".cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }\n", - "\n", - ".cython.line .run { background-color: #B0FFB0; }\n", - ".cython.line .mis { background-color: #FFB0B0; }\n", - ".cython.code.run { border-left: 8px solid #B0FFB0; }\n", - ".cython.code.mis { border-left: 8px solid #FFB0B0; }\n", - "\n", - ".cython.code .py_c_api { color: red; }\n", - ".cython.code .py_macro_api { color: #FF7000; }\n", - ".cython.code .pyx_c_api { color: #FF3000; }\n", - ".cython.code .pyx_macro_api { color: #FF7000; }\n", - ".cython.code .refnanny { color: #FFA000; }\n", - ".cython.code .trace { color: #FFA000; }\n", - ".cython.code .error_goto { color: #FFA000; }\n", - "\n", - ".cython.code .coerce { color: #008000; border: 1px dotted #008000 }\n", - ".cython.code .py_attr { color: #FF0000; font-weight: bold; }\n", - ".cython.code .c_attr { color: #0000FF; }\n", - ".cython.code .py_call { color: #FF0000; font-weight: bold; }\n", - ".cython.code .c_call { color: #0000FF; }\n", - "\n", - ".cython.score-0 {background-color: #FFFFff;}\n", - ".cython.score-1 {background-color: #FFFFe7;}\n", - ".cython.score-2 {background-color: #FFFFd4;}\n", - ".cython.score-3 {background-color: #FFFFc4;}\n", - ".cython.score-4 {background-color: #FFFFb6;}\n", - ".cython.score-5 {background-color: #FFFFaa;}\n", - ".cython.score-6 {background-color: #FFFF9f;}\n", - ".cython.score-7 {background-color: #FFFF96;}\n", - ".cython.score-8 {background-color: #FFFF8d;}\n", - ".cython.score-9 {background-color: #FFFF86;}\n", - ".cython.score-10 {background-color: #FFFF7f;}\n", - ".cython.score-11 {background-color: #FFFF79;}\n", - ".cython.score-12 {background-color: #FFFF73;}\n", - ".cython.score-13 {background-color: #FFFF6e;}\n", - ".cython.score-14 {background-color: #FFFF6a;}\n", - ".cython.score-15 {background-color: #FFFF66;}\n", - ".cython.score-16 {background-color: #FFFF62;}\n", - ".cython.score-17 {background-color: #FFFF5e;}\n", - ".cython.score-18 {background-color: #FFFF5b;}\n", - ".cython.score-19 {background-color: #FFFF57;}\n", - ".cython.score-20 {background-color: #FFFF55;}\n", - ".cython.score-21 {background-color: #FFFF52;}\n", - ".cython.score-22 {background-color: #FFFF4f;}\n", - ".cython.score-23 {background-color: #FFFF4d;}\n", - ".cython.score-24 {background-color: #FFFF4b;}\n", - ".cython.score-25 {background-color: #FFFF48;}\n", - ".cython.score-26 {background-color: #FFFF46;}\n", - ".cython.score-27 {background-color: #FFFF44;}\n", - ".cython.score-28 {background-color: #FFFF43;}\n", - ".cython.score-29 {background-color: #FFFF41;}\n", - ".cython.score-30 {background-color: #FFFF3f;}\n", - ".cython.score-31 {background-color: #FFFF3e;}\n", - ".cython.score-32 {background-color: #FFFF3c;}\n", - ".cython.score-33 {background-color: #FFFF3b;}\n", - ".cython.score-34 {background-color: #FFFF39;}\n", - ".cython.score-35 {background-color: #FFFF38;}\n", - ".cython.score-36 {background-color: #FFFF37;}\n", - ".cython.score-37 {background-color: #FFFF36;}\n", - ".cython.score-38 {background-color: #FFFF35;}\n", - ".cython.score-39 {background-color: #FFFF34;}\n", - ".cython.score-40 {background-color: #FFFF33;}\n", - ".cython.score-41 {background-color: #FFFF32;}\n", - ".cython.score-42 {background-color: #FFFF31;}\n", - ".cython.score-43 {background-color: #FFFF30;}\n", - ".cython.score-44 {background-color: #FFFF2f;}\n", - ".cython.score-45 {background-color: #FFFF2e;}\n", - ".cython.score-46 {background-color: #FFFF2d;}\n", - ".cython.score-47 {background-color: #FFFF2c;}\n", - ".cython.score-48 {background-color: #FFFF2b;}\n", - ".cython.score-49 {background-color: #FFFF2b;}\n", - ".cython.score-50 {background-color: #FFFF2a;}\n", - ".cython.score-51 {background-color: #FFFF29;}\n", - ".cython.score-52 {background-color: #FFFF29;}\n", - ".cython.score-53 {background-color: #FFFF28;}\n", - ".cython.score-54 {background-color: #FFFF27;}\n", - ".cython.score-55 {background-color: #FFFF27;}\n", - ".cython.score-56 {background-color: #FFFF26;}\n", - ".cython.score-57 {background-color: #FFFF26;}\n", - ".cython.score-58 {background-color: #FFFF25;}\n", - ".cython.score-59 {background-color: #FFFF24;}\n", - ".cython.score-60 {background-color: #FFFF24;}\n", - ".cython.score-61 {background-color: #FFFF23;}\n", - ".cython.score-62 {background-color: #FFFF23;}\n", - ".cython.score-63 {background-color: #FFFF22;}\n", - ".cython.score-64 {background-color: #FFFF22;}\n", - ".cython.score-65 {background-color: #FFFF22;}\n", - ".cython.score-66 {background-color: #FFFF21;}\n", - ".cython.score-67 {background-color: #FFFF21;}\n", - ".cython.score-68 {background-color: #FFFF20;}\n", - ".cython.score-69 {background-color: #FFFF20;}\n", - ".cython.score-70 {background-color: #FFFF1f;}\n", - ".cython.score-71 {background-color: #FFFF1f;}\n", - ".cython.score-72 {background-color: #FFFF1f;}\n", - ".cython.score-73 {background-color: #FFFF1e;}\n", - ".cython.score-74 {background-color: #FFFF1e;}\n", - ".cython.score-75 {background-color: #FFFF1e;}\n", - ".cython.score-76 {background-color: #FFFF1d;}\n", - ".cython.score-77 {background-color: #FFFF1d;}\n", - ".cython.score-78 {background-color: #FFFF1c;}\n", - ".cython.score-79 {background-color: #FFFF1c;}\n", - ".cython.score-80 {background-color: #FFFF1c;}\n", - ".cython.score-81 {background-color: #FFFF1c;}\n", - ".cython.score-82 {background-color: #FFFF1b;}\n", - ".cython.score-83 {background-color: #FFFF1b;}\n", - ".cython.score-84 {background-color: #FFFF1b;}\n", - ".cython.score-85 {background-color: #FFFF1a;}\n", - ".cython.score-86 {background-color: #FFFF1a;}\n", - ".cython.score-87 {background-color: #FFFF1a;}\n", - ".cython.score-88 {background-color: #FFFF1a;}\n", - ".cython.score-89 {background-color: #FFFF19;}\n", - ".cython.score-90 {background-color: #FFFF19;}\n", - ".cython.score-91 {background-color: #FFFF19;}\n", - ".cython.score-92 {background-color: #FFFF19;}\n", - ".cython.score-93 {background-color: #FFFF18;}\n", - ".cython.score-94 {background-color: #FFFF18;}\n", - ".cython.score-95 {background-color: #FFFF18;}\n", - ".cython.score-96 {background-color: #FFFF18;}\n", - ".cython.score-97 {background-color: #FFFF17;}\n", - ".cython.score-98 {background-color: #FFFF17;}\n", - ".cython.score-99 {background-color: #FFFF17;}\n", - ".cython.score-100 {background-color: #FFFF17;}\n", - ".cython.score-101 {background-color: #FFFF16;}\n", - ".cython.score-102 {background-color: #FFFF16;}\n", - ".cython.score-103 {background-color: #FFFF16;}\n", - ".cython.score-104 {background-color: #FFFF16;}\n", - ".cython.score-105 {background-color: #FFFF16;}\n", - ".cython.score-106 {background-color: #FFFF15;}\n", - ".cython.score-107 {background-color: #FFFF15;}\n", - ".cython.score-108 {background-color: #FFFF15;}\n", - ".cython.score-109 {background-color: #FFFF15;}\n", - ".cython.score-110 {background-color: #FFFF15;}\n", - ".cython.score-111 {background-color: #FFFF15;}\n", - ".cython.score-112 {background-color: #FFFF14;}\n", - ".cython.score-113 {background-color: #FFFF14;}\n", - ".cython.score-114 {background-color: #FFFF14;}\n", - ".cython.score-115 {background-color: #FFFF14;}\n", - ".cython.score-116 {background-color: #FFFF14;}\n", - ".cython.score-117 {background-color: #FFFF14;}\n", - ".cython.score-118 {background-color: #FFFF13;}\n", - ".cython.score-119 {background-color: #FFFF13;}\n", - ".cython.score-120 {background-color: #FFFF13;}\n", - ".cython.score-121 {background-color: #FFFF13;}\n", - ".cython.score-122 {background-color: #FFFF13;}\n", - ".cython.score-123 {background-color: #FFFF13;}\n", - ".cython.score-124 {background-color: #FFFF13;}\n", - ".cython.score-125 {background-color: #FFFF12;}\n", - ".cython.score-126 {background-color: #FFFF12;}\n", - ".cython.score-127 {background-color: #FFFF12;}\n", - ".cython.score-128 {background-color: #FFFF12;}\n", - ".cython.score-129 {background-color: #FFFF12;}\n", - ".cython.score-130 {background-color: #FFFF12;}\n", - ".cython.score-131 {background-color: #FFFF12;}\n", - ".cython.score-132 {background-color: #FFFF11;}\n", - ".cython.score-133 {background-color: #FFFF11;}\n", - ".cython.score-134 {background-color: #FFFF11;}\n", - ".cython.score-135 {background-color: #FFFF11;}\n", - ".cython.score-136 {background-color: #FFFF11;}\n", - ".cython.score-137 {background-color: #FFFF11;}\n", - ".cython.score-138 {background-color: #FFFF11;}\n", - ".cython.score-139 {background-color: #FFFF11;}\n", - ".cython.score-140 {background-color: #FFFF11;}\n", - ".cython.score-141 {background-color: #FFFF10;}\n", - ".cython.score-142 {background-color: #FFFF10;}\n", - ".cython.score-143 {background-color: #FFFF10;}\n", - ".cython.score-144 {background-color: #FFFF10;}\n", - ".cython.score-145 {background-color: #FFFF10;}\n", - ".cython.score-146 {background-color: #FFFF10;}\n", - ".cython.score-147 {background-color: #FFFF10;}\n", - ".cython.score-148 {background-color: #FFFF10;}\n", - ".cython.score-149 {background-color: #FFFF10;}\n", - ".cython.score-150 {background-color: #FFFF0f;}\n", - ".cython.score-151 {background-color: #FFFF0f;}\n", - ".cython.score-152 {background-color: #FFFF0f;}\n", - ".cython.score-153 {background-color: #FFFF0f;}\n", - ".cython.score-154 {background-color: #FFFF0f;}\n", - ".cython.score-155 {background-color: #FFFF0f;}\n", - ".cython.score-156 {background-color: #FFFF0f;}\n", - ".cython.score-157 {background-color: #FFFF0f;}\n", - ".cython.score-158 {background-color: #FFFF0f;}\n", - ".cython.score-159 {background-color: #FFFF0f;}\n", - ".cython.score-160 {background-color: #FFFF0f;}\n", - ".cython.score-161 {background-color: #FFFF0e;}\n", - ".cython.score-162 {background-color: #FFFF0e;}\n", - ".cython.score-163 {background-color: #FFFF0e;}\n", - ".cython.score-164 {background-color: #FFFF0e;}\n", - ".cython.score-165 {background-color: #FFFF0e;}\n", - ".cython.score-166 {background-color: #FFFF0e;}\n", - ".cython.score-167 {background-color: #FFFF0e;}\n", - ".cython.score-168 {background-color: #FFFF0e;}\n", - ".cython.score-169 {background-color: #FFFF0e;}\n", - ".cython.score-170 {background-color: #FFFF0e;}\n", - ".cython.score-171 {background-color: #FFFF0e;}\n", - ".cython.score-172 {background-color: #FFFF0e;}\n", - ".cython.score-173 {background-color: #FFFF0d;}\n", - ".cython.score-174 {background-color: #FFFF0d;}\n", - ".cython.score-175 {background-color: #FFFF0d;}\n", - ".cython.score-176 {background-color: #FFFF0d;}\n", - ".cython.score-177 {background-color: #FFFF0d;}\n", - ".cython.score-178 {background-color: #FFFF0d;}\n", - ".cython.score-179 {background-color: #FFFF0d;}\n", - ".cython.score-180 {background-color: #FFFF0d;}\n", - ".cython.score-181 {background-color: #FFFF0d;}\n", - ".cython.score-182 {background-color: #FFFF0d;}\n", - ".cython.score-183 {background-color: #FFFF0d;}\n", - ".cython.score-184 {background-color: #FFFF0d;}\n", - ".cython.score-185 {background-color: #FFFF0d;}\n", - ".cython.score-186 {background-color: #FFFF0d;}\n", - ".cython.score-187 {background-color: #FFFF0c;}\n", - ".cython.score-188 {background-color: #FFFF0c;}\n", - ".cython.score-189 {background-color: #FFFF0c;}\n", - ".cython.score-190 {background-color: #FFFF0c;}\n", - ".cython.score-191 {background-color: #FFFF0c;}\n", - ".cython.score-192 {background-color: #FFFF0c;}\n", - ".cython.score-193 {background-color: #FFFF0c;}\n", - ".cython.score-194 {background-color: #FFFF0c;}\n", - ".cython.score-195 {background-color: #FFFF0c;}\n", - ".cython.score-196 {background-color: #FFFF0c;}\n", - ".cython.score-197 {background-color: #FFFF0c;}\n", - ".cython.score-198 {background-color: #FFFF0c;}\n", - ".cython.score-199 {background-color: #FFFF0c;}\n", - ".cython.score-200 {background-color: #FFFF0c;}\n", - ".cython.score-201 {background-color: #FFFF0c;}\n", - ".cython.score-202 {background-color: #FFFF0c;}\n", - ".cython.score-203 {background-color: #FFFF0b;}\n", - ".cython.score-204 {background-color: #FFFF0b;}\n", - ".cython.score-205 {background-color: #FFFF0b;}\n", - ".cython.score-206 {background-color: #FFFF0b;}\n", - ".cython.score-207 {background-color: #FFFF0b;}\n", - ".cython.score-208 {background-color: #FFFF0b;}\n", - ".cython.score-209 {background-color: #FFFF0b;}\n", - ".cython.score-210 {background-color: #FFFF0b;}\n", - ".cython.score-211 {background-color: #FFFF0b;}\n", - ".cython.score-212 {background-color: #FFFF0b;}\n", - ".cython.score-213 {background-color: #FFFF0b;}\n", - ".cython.score-214 {background-color: #FFFF0b;}\n", - ".cython.score-215 {background-color: #FFFF0b;}\n", - ".cython.score-216 {background-color: #FFFF0b;}\n", - ".cython.score-217 {background-color: #FFFF0b;}\n", - ".cython.score-218 {background-color: #FFFF0b;}\n", - ".cython.score-219 {background-color: #FFFF0b;}\n", - ".cython.score-220 {background-color: #FFFF0b;}\n", - ".cython.score-221 {background-color: #FFFF0b;}\n", - ".cython.score-222 {background-color: #FFFF0a;}\n", - ".cython.score-223 {background-color: #FFFF0a;}\n", - ".cython.score-224 {background-color: #FFFF0a;}\n", - ".cython.score-225 {background-color: #FFFF0a;}\n", - ".cython.score-226 {background-color: #FFFF0a;}\n", - ".cython.score-227 {background-color: #FFFF0a;}\n", - ".cython.score-228 {background-color: #FFFF0a;}\n", - ".cython.score-229 {background-color: #FFFF0a;}\n", - ".cython.score-230 {background-color: #FFFF0a;}\n", - ".cython.score-231 {background-color: #FFFF0a;}\n", - ".cython.score-232 {background-color: #FFFF0a;}\n", - ".cython.score-233 {background-color: #FFFF0a;}\n", - ".cython.score-234 {background-color: #FFFF0a;}\n", - ".cython.score-235 {background-color: #FFFF0a;}\n", - ".cython.score-236 {background-color: #FFFF0a;}\n", - ".cython.score-237 {background-color: #FFFF0a;}\n", - ".cython.score-238 {background-color: #FFFF0a;}\n", - ".cython.score-239 {background-color: #FFFF0a;}\n", - ".cython.score-240 {background-color: #FFFF0a;}\n", - ".cython.score-241 {background-color: #FFFF0a;}\n", - ".cython.score-242 {background-color: #FFFF0a;}\n", - ".cython.score-243 {background-color: #FFFF0a;}\n", - ".cython.score-244 {background-color: #FFFF0a;}\n", - ".cython.score-245 {background-color: #FFFF0a;}\n", - ".cython.score-246 {background-color: #FFFF09;}\n", - ".cython.score-247 {background-color: #FFFF09;}\n", - ".cython.score-248 {background-color: #FFFF09;}\n", - ".cython.score-249 {background-color: #FFFF09;}\n", - ".cython.score-250 {background-color: #FFFF09;}\n", - ".cython.score-251 {background-color: #FFFF09;}\n", - ".cython.score-252 {background-color: #FFFF09;}\n", - ".cython.score-253 {background-color: #FFFF09;}\n", - ".cython.score-254 {background-color: #FFFF09;}\n", - ".cython .hll { background-color: #ffffcc }\n", - ".cython { background: #f8f8f8; }\n", - ".cython .c { color: #408080; font-style: italic } /* Comment */\n", - ".cython .err { border: 1px solid #FF0000 } /* Error */\n", - ".cython .k { color: #008000; font-weight: bold } /* Keyword */\n", - ".cython .o { color: #666666 } /* Operator */\n", - ".cython .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n", - ".cython .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n", - ".cython .cp { color: #BC7A00 } /* Comment.Preproc */\n", - ".cython .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n", - ".cython .c1 { color: #408080; font-style: italic } /* Comment.Single */\n", - ".cython .cs { color: #408080; font-style: italic } /* Comment.Special */\n", - ".cython .gd { color: #A00000 } /* Generic.Deleted */\n", - ".cython .ge { font-style: italic } /* Generic.Emph */\n", - ".cython .gr { color: #FF0000 } /* Generic.Error */\n", - ".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", - ".cython .gi { color: #00A000 } /* Generic.Inserted */\n", - ".cython .go { color: #888888 } /* Generic.Output */\n", - ".cython .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n", - ".cython .gs { font-weight: bold } /* Generic.Strong */\n", - ".cython .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n", - ".cython .gt { color: #0044DD } /* Generic.Traceback */\n", - ".cython .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n", - ".cython .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n", - ".cython .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n", - ".cython .kp { color: #008000 } /* Keyword.Pseudo */\n", - ".cython .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n", - ".cython .kt { color: #B00040 } /* Keyword.Type */\n", - ".cython .m { color: #666666 } /* Literal.Number */\n", - ".cython .s { color: #BA2121 } /* Literal.String */\n", - ".cython .na { color: #7D9029 } /* Name.Attribute */\n", - ".cython .nb { color: #008000 } /* Name.Builtin */\n", - ".cython .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n", - ".cython .no { color: #880000 } /* Name.Constant */\n", - ".cython .nd { color: #AA22FF } /* Name.Decorator */\n", - ".cython .ni { color: #999999; font-weight: bold } /* Name.Entity */\n", - ".cython .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n", - ".cython .nf { color: #0000FF } /* Name.Function */\n", - ".cython .nl { color: #A0A000 } /* Name.Label */\n", - ".cython .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n", - ".cython .nt { color: #008000; font-weight: bold } /* Name.Tag */\n", - ".cython .nv { color: #19177C } /* Name.Variable */\n", - ".cython .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n", - ".cython .w { color: #bbbbbb } /* Text.Whitespace */\n", - ".cython .mb { color: #666666 } /* Literal.Number.Bin */\n", - ".cython .mf { color: #666666 } /* Literal.Number.Float */\n", - ".cython .mh { color: #666666 } /* Literal.Number.Hex */\n", - ".cython .mi { color: #666666 } /* Literal.Number.Integer */\n", - ".cython .mo { color: #666666 } /* Literal.Number.Oct */\n", - ".cython .sa { color: #BA2121 } /* Literal.String.Affix */\n", - ".cython .sb { color: #BA2121 } /* Literal.String.Backtick */\n", - ".cython .sc { color: #BA2121 } /* Literal.String.Char */\n", - ".cython .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", - ".cython .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", - ".cython .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".cython .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n", - ".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".cython .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n", - ".cython .sx { color: #008000 } /* Literal.String.Other */\n", - ".cython .sr { color: #BB6688 } /* Literal.String.Regex */\n", - ".cython .s1 { color: #BA2121 } /* Literal.String.Single */\n", - ".cython .ss { color: #19177C } /* Literal.String.Symbol */\n", - ".cython .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", - ".cython .fm { color: #0000FF } /* Name.Function.Magic */\n", - ".cython .vc { color: #19177C } /* Name.Variable.Class */\n", - ".cython .vg { color: #19177C } /* Name.Variable.Global */\n", - ".cython .vi { color: #19177C } /* Name.Variable.Instance */\n", - ".cython .vm { color: #19177C } /* Name.Variable.Magic */\n", - ".cython .il { color: #666666 } /* Literal.Number.Integer.Long */\n", - " </style>\n", - "</head>\n", - "<body class=\"cython\">\n", - "<p><span style=\"border-bottom: solid 1px grey;\">Generated by Cython 0.29</span></p>\n", - "<p>\n", - " <span style=\"background-color: #FFFF00\">Yellow lines</span> hint at Python interaction.<br />\n", - " Click on a line that starts with a \"<code>+</code>\" to see the C code that Cython generated for it.\n", - "</p>\n", - "<div class=\"cython\"><pre class=\"cython line score-16\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">01</span>: <span class=\"k\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n", - "<pre class='cython code score-16 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_numpy, 0, 0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __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_np, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 1, __pyx_L1_error)</span>\n", - " <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", - "/* … */\n", - " __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyDict_NewPresized</span>(0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __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) < 0) <span class='error_goto'>__PYX_ERR(0, 1, __pyx_L1_error)</span>\n", - " <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", - "</pre><pre class=\"cython line score-0\"> <span class=\"\">02</span>: <span class=\"k\">cimport</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">cnp</span></pre>\n", - "<pre class=\"cython line score-0\"> <span class=\"\">03</span>: <span class=\"k\">from</span> <span class=\"nn\">cython.parallel</span> <span class=\"k\">import</span> <span class=\"n\">prange</span></pre>\n", - "<pre class=\"cython line score-0\"> <span class=\"\">04</span>: </pre>\n", - "<pre class=\"cython line score-18\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">05</span>: <span class=\"k\">cpdef</span> <span class=\"kt\">double</span> <span class=\"nf\">loop2</span><span class=\"p\">(</span><span class=\"nb\">int</span> <span class=\"n\">N</span><span class=\"p\">):</span></pre>\n", - "<pre class='cython code score-18 '>static PyObject *__pyx_pw_46_cython_magic_86cb9b709227623179295619ed95fbfe_1loop2(PyObject *__pyx_self, PyObject *__pyx_arg_N); /*proto*/\n", - "static double __pyx_f_46_cython_magic_86cb9b709227623179295619ed95fbfe_loop2(CYTHON_UNUSED int __pyx_v_N, CYTHON_UNUSED int __pyx_skip_dispatch) {\n", - " int __pyx_v_i;\n", - " int __pyx_v_out;\n", - " double __pyx_r;\n", - " <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", - " <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"loop2\", 0);\n", - "/* … */\n", - " /* function exit code */\n", - " __pyx_L0:;\n", - " <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", - " return __pyx_r;\n", - "}\n", - "\n", - "/* Python wrapper */\n", - "static PyObject *__pyx_pw_46_cython_magic_86cb9b709227623179295619ed95fbfe_1loop2(PyObject *__pyx_self, PyObject *__pyx_arg_N); /*proto*/\n", - "static PyObject *__pyx_pw_46_cython_magic_86cb9b709227623179295619ed95fbfe_1loop2(PyObject *__pyx_self, PyObject *__pyx_arg_N) {\n", - " int __pyx_v_N;\n", - " PyObject *__pyx_r = 0;\n", - " <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", - " <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"loop2 (wrapper)\", 0);\n", - " assert(__pyx_arg_N); {\n", - " __pyx_v_N = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_arg_N); if (unlikely((__pyx_v_N == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 5, __pyx_L3_error)</span>\n", - " }\n", - " goto __pyx_L4_argument_unpacking_done;\n", - " __pyx_L3_error:;\n", - " <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_86cb9b709227623179295619ed95fbfe.loop2\", __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_86cb9b709227623179295619ed95fbfe_loop2(__pyx_self, ((int)__pyx_v_N));\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_86cb9b709227623179295619ed95fbfe_loop2(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_N) {\n", - " PyObject *__pyx_r = NULL;\n", - " <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", - " <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"loop2\", 0);\n", - " <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", - " __pyx_t_1 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_f_46_cython_magic_86cb9b709227623179295619ed95fbfe_loop2(__pyx_v_N, 0));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 5, __pyx_L1_error)</span>\n", - " <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", - " __pyx_r = __pyx_t_1;\n", - " __pyx_t_1 = 0;\n", - " goto __pyx_L0;\n", - "\n", - " /* function exit code */\n", - " __pyx_L1_error:;\n", - " <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n", - " <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_86cb9b709227623179295619ed95fbfe.loop2\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", - " __pyx_r = NULL;\n", - " __pyx_L0:;\n", - " <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", - " <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", - " return __pyx_r;\n", - "}\n", - "</pre><pre class=\"cython line score-0\"> <span class=\"\">06</span>: <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">i</span></pre>\n", - "<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">07</span>: <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">out</span> <span class=\"o\">=</span> <span class=\"mf\">0</span></pre>\n", - "<pre class='cython code score-0 '> __pyx_v_out = 0;\n", - "</pre><pre class=\"cython line score-4\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">08</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">prange</span><span class=\"p\">(</span><span class=\"n\">N</span><span class=\"p\">,</span> <span class=\"k\">nogil</span><span class=\"o\">=</span><span class=\"bp\">True</span><span class=\"p\">,</span> <span class=\"n\">schedule</span><span class=\"o\">=</span><span class=\"s\">'dynamic'</span><span class=\"p\">,</span> <span class=\"n\">num_threads</span> <span class=\"o\">=</span> <span class=\"mf\">4</span><span class=\"p\">):</span></pre>\n", - "<pre class='cython code score-4 '> {\n", - " #ifdef WITH_THREAD\n", - " PyThreadState *_save;\n", - " Py_UNBLOCK_THREADS\n", - " <span class='pyx_c_api'>__Pyx_FastGIL_Remember</span>();\n", - " #endif\n", - " /*try:*/ {\n", - " __pyx_t_1 = __pyx_v_N;\n", - " if (1 == 0) abort();\n", - " {\n", - " #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))\n", - " #undef likely\n", - " #undef unlikely\n", - " #define likely(x) (x)\n", - " #define unlikely(x) (x)\n", - " #endif\n", - " __pyx_t_3 = (__pyx_t_1 - 0 + 1 - 1/abs(1)) / 1;\n", - " if (__pyx_t_3 > 0)\n", - " {\n", - " #ifdef _OPENMP\n", - " #pragma omp parallel\n", - " #endif /* _OPENMP */\n", - " {\n", - " #ifdef _OPENMP\n", - " #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_out) schedule(dynamic) num_threads(4)\n", - " #endif /* _OPENMP */\n", - " for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_3; __pyx_t_2++){\n", - " {\n", - " __pyx_v_i = (int)(0 + 1 * __pyx_t_2);\n", - " /* Initialize private variables to invalid values */\n", - " __pyx_v_out = ((int)0xbad0bad0);\n", - "/* … */\n", - " /*finally:*/ {\n", - " /*normal exit:*/{\n", - " #ifdef WITH_THREAD\n", - " <span class='pyx_c_api'>__Pyx_FastGIL_Forget</span>();\n", - " Py_BLOCK_THREADS\n", - " #endif\n", - " goto __pyx_L5;\n", - " }\n", - " __pyx_L5:;\n", - " }\n", - " }\n", - "</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">09</span>: <span class=\"n\">out</span><span class=\"o\">=</span><span class=\"n\">i</span></pre>\n", - "<pre class='cython code score-0 '> __pyx_v_out = __pyx_v_i;\n", - " }\n", - " }\n", - " }\n", - " }\n", - " }\n", - " #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))\n", - " #undef likely\n", - " #undef unlikely\n", - " #define likely(x) __builtin_expect(!!(x), 1)\n", - " #define unlikely(x) __builtin_expect(!!(x), 0)\n", - " #endif\n", - " }\n", - "</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">10</span>: <span class=\"k\">return</span> <span class=\"n\">out</span></pre>\n", - "<pre class='cython code score-0 '> __pyx_r = __pyx_v_out;\n", - " goto __pyx_L0;\n", - "</pre></div></body></html>" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "39 µs ± 82.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", + "39.2 µs ± 87.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" + ] } ], "source": [ - "%%cython -a\n", "import numpy as np\n", - "cimport numpy as cnp\n", - "from cython.parallel import prange\n", "\n", - "cpdef double loop2(int N):\n", - " cdef int i\n", - " cdef int out = 0\n", - " for i in prange(N, nogil=True, schedule='dynamic', num_threads = 4):\n", - " out=i\n", - " return out" + "Xin = np.random.random((10000))+1e0\n", + "\n", + "%timeit func1(Xin)\n", + "%timeit func2(Xin)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here you can easily run into issues if you want to sum numbers as they all threads have to access the same variable. Cython does make sure the answer is right (unlike in C) but the code becomes effectivly serial so the code will run slower due to the overheads for creating the threads in the first place. Try switching `out=i` to `out+=i` and run the timing again. Still, this can be an easy way to paralleise simple loops. Note that this will not happen if there is any python inside the loop, it has to be all cython." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 2, "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "5.24 µs ± 7.56 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n", - "469 ns ± 0.666 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n" + "unable to execute 'gcc-8.2': No such file or directory\n" + ] + }, + { + "ename": "CompileError", + "evalue": "command 'gcc-8.2' failed with exit status 1", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mDistutilsExecError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/distutils/unixccompiler.py\u001b[0m in \u001b[0;36m_compile\u001b[0;34m(self, obj, src, ext, cc_args, extra_postargs, pp_opts)\u001b[0m\n\u001b[1;32m 117\u001b[0m self.spawn(compiler_so + cc_args + [src, '-o', obj] +\n\u001b[0;32m--> 118\u001b[0;31m extra_postargs)\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mDistutilsExecError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/distutils/ccompiler.py\u001b[0m in \u001b[0;36mspawn\u001b[0;34m(self, cmd)\u001b[0m\n\u001b[1;32m 908\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mspawn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcmd\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 909\u001b[0;31m \u001b[0mspawn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmd\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdry_run\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdry_run\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 910\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/distutils/spawn.py\u001b[0m in \u001b[0;36mspawn\u001b[0;34m(cmd, search_path, verbose, dry_run)\u001b[0m\n\u001b[1;32m 35\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'posix'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 36\u001b[0;31m \u001b[0m_spawn_posix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmd\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msearch_path\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdry_run\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdry_run\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 37\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'nt'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/distutils/spawn.py\u001b[0m in \u001b[0;36m_spawn_posix\u001b[0;34m(cmd, search_path, verbose, dry_run)\u001b[0m\n\u001b[1;32m 158\u001b[0m \u001b[0;34m\"command %r failed with exit status %d\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 159\u001b[0;31m % (cmd, exit_status))\n\u001b[0m\u001b[1;32m 160\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mWIFSTOPPED\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstatus\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mDistutilsExecError\u001b[0m: command 'gcc-8.2' failed with exit status 1", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mCompileError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-2-7ab96ff9b535>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_cell_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'cython'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'--compile-args=-fopenmp --link-args=-fopenmp'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'from cython.parallel import prange\\n\\ncdef int i\\ncdef int n = 30\\ncdef int sum = 0\\n\\n# for i in range(n):\\nfor i in prange(n, nogil=True):\\n sum += i\\n\\nprint(sum)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_cell_magic\u001b[0;34m(self, magic_name, line, cell)\u001b[0m\n\u001b[1;32m 2165\u001b[0m \u001b[0mmagic_arg_s\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvar_expand\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstack_depth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2166\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2167\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmagic_arg_s\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcell\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2168\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m<decorator-gen-127>\u001b[0m in \u001b[0;36mcython\u001b[0;34m(self, line, cell)\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/site-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/site-packages/Cython/Build/IpythonMagic.py\u001b[0m in \u001b[0;36mcython\u001b[0;34m(self, line, cell)\u001b[0m\n\u001b[1;32m 331\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 332\u001b[0m self._build_extension(extension, lib_dir, pgo_step_name='use' if args.pgo else None,\n\u001b[0;32m--> 333\u001b[0;31m quiet=args.quiet)\n\u001b[0m\u001b[1;32m 334\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 335\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mimp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload_dynamic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodule_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_path\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/site-packages/Cython/Build/IpythonMagic.py\u001b[0m in \u001b[0;36m_build_extension\u001b[0;34m(self, extension, lib_dir, temp_dir, pgo_step_name, quiet)\u001b[0m\n\u001b[1;32m 441\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mquiet\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 442\u001b[0m \u001b[0mold_threshold\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdistutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_threshold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdistutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDEBUG\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 443\u001b[0;31m \u001b[0mbuild_extension\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 444\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 445\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mquiet\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mold_threshold\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/distutils/command/build_ext.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 337\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 338\u001b[0m \u001b[0;31m# Now actually compile and link everything.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 339\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuild_extensions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 340\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 341\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcheck_extensions_list\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextensions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/distutils/command/build_ext.py\u001b[0m in \u001b[0;36mbuild_extensions\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 446\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_build_extensions_parallel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 448\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_build_extensions_serial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 449\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 450\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_build_extensions_parallel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/distutils/command/build_ext.py\u001b[0m in \u001b[0;36m_build_extensions_serial\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 471\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mext\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextensions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 472\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_filter_build_errors\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 473\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuild_extension\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 474\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 475\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mcontextlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontextmanager\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/distutils/command/build_ext.py\u001b[0m in \u001b[0;36mbuild_extension\u001b[0;34m(self, ext)\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 532\u001b[0m \u001b[0mextra_postargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mextra_args\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 533\u001b[0;31m depends=ext.depends)\n\u001b[0m\u001b[1;32m 534\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 535\u001b[0m \u001b[0;31m# XXX outdated variable, kept here in case third-part code\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/distutils/ccompiler.py\u001b[0m in \u001b[0;36mcompile\u001b[0;34m(self, sources, output_dir, macros, include_dirs, debug, extra_preargs, extra_postargs, depends)\u001b[0m\n\u001b[1;32m 572\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 573\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 574\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_compile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcc_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextra_postargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpp_opts\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 575\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 576\u001b[0m \u001b[0;31m# Return *all* object filenames, not just the ones we just built.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/HPC_course/lib/python3.7/distutils/unixccompiler.py\u001b[0m in \u001b[0;36m_compile\u001b[0;34m(self, obj, src, ext, cc_args, extra_postargs, pp_opts)\u001b[0m\n\u001b[1;32m 118\u001b[0m extra_postargs)\n\u001b[1;32m 119\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mDistutilsExecError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 120\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mCompileError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 121\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 122\u001b[0m def create_static_lib(self, objects, output_libname,\n", + "\u001b[0;31mCompileError\u001b[0m: command 'gcc-8.2' failed with exit status 1" ] } ], "source": [ - "import numpy as np\n", + "%%cython --compile-args=-fopenmp --link-args=-fopenmp\n", + "from cython.parallel import prange\n", "\n", - "%timeit loop1(10000)\n", - "%timeit loop2(10000)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here you can easily run into issues if you want to sum numbers as they all threads have to access the same variable. Cython does make sure the answer is right (unlike in C) but the code becomes effectivly serial so the code will run slower due to the overheads for creating the threads in the first place. Try switching `out=i` to `out+=i` and run the timing again. Still, this can be an easy way to paralleise simple loops. Note that this will not happen if there is any python inside the loop, it has to be all cython." + "cdef int i\n", + "cdef int n = 30\n", + "cdef int sum = 0\n", + "\n", + "# for i in range(n):\n", + "for i in prange(n, nogil=True):\n", + " sum += i\n", + "\n", + "print(sum)" ] }, {