Created
November 5, 2020 14:59
-
-
Save jorisvandenbossche/b03bfe660d02eb43922cd632f3fa9857 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Cython: getting an extension type item out of an object dtyped array with nogil\n", | |
"\n", | |
"Relevant (old) discussion: https://groups.google.com/g/cython-users/c/PXijIPUxP9c/m/t190l0QnjE0J" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"%load_ext cython" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 50, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<!DOCTYPE html>\n", | |
"<!-- Generated by Cython 0.29.21 -->\n", | |
"<html>\n", | |
"<head>\n", | |
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", | |
" <title>Cython: _cython_magic_a1cf44e9972ce86eaa0423e426682695.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.21</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-0\"> <span class=\"\">01</span>: </pre>\n", | |
"<pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">02</span>: <span class=\"k\">import</span> <span class=\"nn\">cython</span></pre>\n", | |
"<pre class='cython code score-8 '> __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, 2, __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, 2, __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=\"\">03</span>: </pre>\n", | |
"<pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">04</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-8 '> __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, 4, __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, 4, __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=\"\">05</span>: <span class=\"k\">cimport</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">06</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">07</span>: <span class=\"k\">from</span> <span class=\"nn\">cpython.object</span> <span class=\"k\">cimport</span> <span class=\"n\">PyObject</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">08</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">09</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">10</span>: <span class=\"k\">cdef</span> <span class=\"kr\">extern</span> <span class=\"k\">from</span> <span class=\"s\">"Python.h"</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">11</span>: <span class=\"nb\">int</span> <span class=\"n\">PyLong_CheckExact</span><span class=\"p\">(</span><span class=\"n\">PyObject</span> <span class=\"o\">*</span><span class=\"n\">obj</span><span class=\"p\">)</span> <span class=\"k\">nogil</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">12</span>: <span class=\"nb\">long</span> <span class=\"n\">PyLong_AsLong</span><span class=\"p\">(</span><span class=\"n\">PyObject</span> <span class=\"o\">*</span><span class=\"n\">obj</span><span class=\"p\">)</span> <span class=\"k\">nogil</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">13</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">14</span>: <span class=\"nb\">int</span> <span class=\"n\">PyFloat_CheckExact</span><span class=\"p\">(</span><span class=\"n\">PyObject</span> <span class=\"o\">*</span><span class=\"n\">obj</span><span class=\"p\">)</span> <span class=\"k\">nogil</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">15</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">16</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">17</span>: <span class=\"k\">cdef</span> <span class=\"kr\">extern</span> <span class=\"k\">from</span> <span class=\"s\">"Python.h"</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">18</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">19</span>: <span class=\"k\">ctypedef</span> <span class=\"k\">struct</span> <span class=\"nc\">PyFloatObject</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">20</span>: <span class=\"n\">double</span> <span class=\"n\">ob_fval</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">21</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">22</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">23</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">24</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">boundscheck</span><span class=\"p\">(</span><span class=\"bp\">False</span><span class=\"p\">)</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">25</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">wraparound</span><span class=\"p\">(</span><span class=\"bp\">False</span><span class=\"p\">)</span></pre>\n", | |
"<pre class=\"cython line score-26\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">26</span>: <span class=\"k\">def</span> <span class=\"nf\">sum_object_array_of_floats</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ndarray</span><span class=\"p\">[</span><span class=\"nb\">object</span><span class=\"p\">]</span> <span class=\"n\">array</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-26 '>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_a1cf44e9972ce86eaa0423e426682695_1sum_object_array_of_floats(PyObject *__pyx_self, PyObject *__pyx_v_array); /*proto*/\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_a1cf44e9972ce86eaa0423e426682695_1sum_object_array_of_floats = {\"sum_object_array_of_floats\", (PyCFunction)__pyx_pw_46_cython_magic_a1cf44e9972ce86eaa0423e426682695_1sum_object_array_of_floats, METH_O, 0};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_a1cf44e9972ce86eaa0423e426682695_1sum_object_array_of_floats(PyObject *__pyx_self, PyObject *__pyx_v_array) {\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"sum_object_array_of_floats (wrapper)\", 0);\n", | |
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_array), __pyx_ptype_5numpy_ndarray, 1, \"array\", 0))) <span class='error_goto'>__PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_a1cf44e9972ce86eaa0423e426682695_sum_object_array_of_floats(__pyx_self, ((PyArrayObject *)__pyx_v_array));\n", | |
" int __pyx_lineno = 0;\n", | |
" const char *__pyx_filename = NULL;\n", | |
" int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" goto __pyx_L0;\n", | |
" __pyx_L1_error:;\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_a1cf44e9972ce86eaa0423e426682695_sum_object_array_of_floats(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_array) {\n", | |
" Py_ssize_t __pyx_v_idx;\n", | |
" unsigned int __pyx_v_n;\n", | |
" double __pyx_v_val;\n", | |
" double __pyx_v_total;\n", | |
" PyObject *__pyx_v_obj;\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_array;\n", | |
" __Pyx_Buffer __pyx_pybuffer_array;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"sum_object_array_of_floats\", 0);\n", | |
" __pyx_pybuffer_array.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_array.refcount = 0;\n", | |
" __pyx_pybuffernd_array.data = NULL;\n", | |
" __pyx_pybuffernd_array.rcbuffer = &__pyx_pybuffer_array;\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_array.rcbuffer->pybuffer, (PyObject*)__pyx_v_array, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) <span class='error_goto'>__PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_pybuffernd_array.diminfo[0].strides = __pyx_pybuffernd_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_array.diminfo[0].shape = __pyx_pybuffernd_array.rcbuffer->pybuffer.shape[0];\n", | |
"/* … */\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n", | |
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n", | |
" __Pyx_PyThreadState_declare\n", | |
" __Pyx_PyThreadState_assign\n", | |
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_array.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_ErrRestore</span>(__pyx_type, __pyx_value, __pyx_tb);}\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_a1cf44e9972ce86eaa0423e426682695.sum_object_array_of_floats\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" goto __pyx_L2;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_array.rcbuffer->pybuffer);\n", | |
" __pyx_L2:;\n", | |
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"/* … */\n", | |
" __pyx_tuple__9 = <span class='py_c_api'>PyTuple_Pack</span>(6, __pyx_n_s_array, __pyx_n_s_idx, __pyx_n_s_n, __pyx_n_s_val, __pyx_n_s_total, __pyx_n_s_obj);<span class='error_goto'> if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__9);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__9);\n", | |
"/* … */\n", | |
" __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_a1cf44e9972ce86eaa0423e426682695_1sum_object_array_of_floats, NULL, __pyx_n_s_cython_magic_a1cf44e9972ce86eaa);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 26, __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_sum_object_array_of_floats, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 26, __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=\"\">27</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">28</span>: <span class=\"k\">cdef</span> <span class=\"kt\">Py_ssize_t</span> <span class=\"nf\">idx</span></pre>\n", | |
"<pre class=\"cython line score-10\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">29</span>: <span class=\"k\">cdef</span> <span class=\"kt\">unsigned</span> <span class=\"kt\">int</span> <span class=\"nf\">n</span> <span class=\"o\">=</span> <span class=\"n\">array</span><span class=\"o\">.</span><span class=\"n\">size</span></pre>\n", | |
"<pre class='cython code score-10 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_array), __pyx_n_s_size);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyInt_As_unsigned_int</span>(__pyx_t_1); if (unlikely((__pyx_t_2 == (unsigned int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 29, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_v_n = __pyx_t_2;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">30</span>: <span class=\"k\">cdef</span> <span class=\"kt\">double</span> <span class=\"nf\">val</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">31</span>: <span class=\"k\">cdef</span> <span class=\"kt\">double</span> <span class=\"nf\">total</span> <span class=\"o\">=</span> <span class=\"mf\">0.0</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_total = 0.0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">32</span>: <span class=\"k\">cdef</span> <span class=\"kt\">PyObject</span> *<span class=\"nf\">obj</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">33</span>: </pre>\n", | |
"<pre class=\"cython line score-6\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">34</span>: <span class=\"k\">with</span> <span class=\"k\">nogil</span><span class=\"p\">:</span></pre>\n", | |
"<pre class='cython code score-6 '> {\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", | |
"/* … */\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_L4_error: {\n", | |
" #ifdef WITH_THREAD\n", | |
" <span class='pyx_c_api'>__Pyx_FastGIL_Forget</span>();\n", | |
" Py_BLOCK_THREADS\n", | |
" #endif\n", | |
" goto __pyx_L1_error;\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=\"\">35</span>: <span class=\"k\">for</span> <span class=\"n\">idx</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_2 = __pyx_v_n;\n", | |
" __pyx_t_3 = __pyx_t_2;\n", | |
" for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {\n", | |
" __pyx_v_idx = __pyx_t_4;\n", | |
"</pre><pre class=\"cython line score-4\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">36</span>: <span class=\"k\">with</span> <span class=\"k\">gil</span><span class=\"p\">:</span></pre>\n", | |
"<pre class='cython code score-4 '> {\n", | |
" #ifdef WITH_THREAD\n", | |
" PyGILState_STATE __pyx_gilstate_save = <span class='pyx_c_api'>__Pyx_PyGILState_Ensure</span>();\n", | |
" #endif\n", | |
" /*try:*/ {\n", | |
"/* … */\n", | |
" /*finally:*/ {\n", | |
" /*normal exit:*/{\n", | |
" #ifdef WITH_THREAD\n", | |
" <span class='pyx_c_api'>__Pyx_PyGILState_Release</span>(__pyx_gilstate_save);\n", | |
" #endif\n", | |
" goto __pyx_L12;\n", | |
" }\n", | |
" __pyx_L12:;\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-2\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">37</span>: <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">PyObject</span> <span class=\"o\">*></span><span class=\"n\">array</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-2 '> __pyx_t_5 = __pyx_v_idx;\n", | |
" __pyx_t_1 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_array.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_array.diminfo[0].strides);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>((PyObject*)__pyx_t_1);\n", | |
" __pyx_v_obj = ((PyObject *)__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-5\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">38</span>: <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">PyFloat_CheckExact</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-5 '> __pyx_t_6 = ((!(<span class='py_c_api'>PyFloat_CheckExact</span>(__pyx_v_obj) != 0)) != 0);\n", | |
" if (__pyx_t_6) {\n", | |
"/* … */\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-14\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">39</span>: <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s\">"require ints"</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-14 '> {\n", | |
" #ifdef WITH_THREAD\n", | |
" PyGILState_STATE __pyx_gilstate_save = <span class='pyx_c_api'>__Pyx_PyGILState_Ensure</span>();\n", | |
" #endif\n", | |
" /*try:*/ {\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_TypeError, __pyx_tuple_, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L17_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_Raise</span>(__pyx_t_1, 0, 0, 0);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" <span class='error_goto'>__PYX_ERR(0, 39, __pyx_L17_error)</span>\n", | |
" }\n", | |
" /*finally:*/ {\n", | |
" __pyx_L17_error: {\n", | |
" #ifdef WITH_THREAD\n", | |
" <span class='pyx_c_api'>__Pyx_PyGILState_Release</span>(__pyx_gilstate_save);\n", | |
" #endif\n", | |
" goto __pyx_L4_error;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"/* … */\n", | |
" __pyx_tuple_ = <span class='py_c_api'>PyTuple_Pack</span>(1, __pyx_kp_u_require_ints);<span class='error_goto'> if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 39, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple_);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple_);\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">40</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">41</span>: <span class=\"n\">val</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\"><</span><span class=\"n\">PyFloatObject</span> <span class=\"o\">*></span><span class=\"n\">obj</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">ob_fval</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_7 = ((PyFloatObject *)__pyx_v_obj)->ob_fval;\n", | |
" __pyx_v_val = __pyx_t_7;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">42</span>: <span class=\"n\">total</span> <span class=\"o\">+=</span> <span class=\"n\">val</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_total = (__pyx_v_total + __pyx_v_val);\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">43</span>: </pre>\n", | |
"<pre class=\"cython line score-6\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">44</span>: <span class=\"k\">return</span> <span class=\"n\">total</span></pre>\n", | |
"<pre class='cython code score-6 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" __pyx_t_1 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_total);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __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", | |
"</pre></div></body></html>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"execution_count": 50, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"%%cython -L /home/joris/miniconda3/envs/geo-dev/lib -I /home/joris/miniconda3/envs/geo-dev/include -a\n", | |
"\n", | |
"import cython\n", | |
"\n", | |
"import numpy as np\n", | |
"cimport numpy as np\n", | |
"\n", | |
"from cpython.object cimport PyObject\n", | |
"\n", | |
"\n", | |
"cdef extern from \"Python.h\":\n", | |
" int PyFloat_CheckExact(PyObject *obj) nogil\n", | |
"\n", | |
" ctypedef struct PyFloatObject:\n", | |
" double ob_fval\n", | |
"\n", | |
"\n", | |
"@cython.boundscheck(False)\n", | |
"@cython.wraparound(False)\n", | |
"def sum_object_array_of_floats(np.ndarray[object] array):\n", | |
" \n", | |
" cdef Py_ssize_t idx\n", | |
" cdef unsigned int n = array.size\n", | |
" cdef double val\n", | |
" cdef double total = 0.0\n", | |
" cdef PyObject *obj\n", | |
"\n", | |
" with nogil:\n", | |
" for idx in range(n):\n", | |
" with gil:\n", | |
" obj = <PyObject *>array[idx]\n", | |
" if not PyFloat_CheckExact(obj):\n", | |
" with gil:\n", | |
" raise TypeError(\"require floats\")\n", | |
"\n", | |
" val = (<PyFloatObject *>obj).ob_fval\n", | |
" total += val\n", | |
"\n", | |
" return total" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 51, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"arr = np.arange(0.0, 10.0, 0.5, dtype=object)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 52, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"float" | |
] | |
}, | |
"execution_count": 52, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"type(arr[0])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 54, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"95.0" | |
] | |
}, | |
"execution_count": 54, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"sum_object_array_of_floats(arr)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 59, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<!DOCTYPE html>\n", | |
"<!-- Generated by Cython 0.29.21 -->\n", | |
"<html>\n", | |
"<head>\n", | |
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", | |
" <title>Cython: _cython_magic_424dac6e7f458a84e421b1d55c7ab38a.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.21</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-0\"> <span class=\"\">01</span>: </pre>\n", | |
"<pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">02</span>: <span class=\"k\">import</span> <span class=\"nn\">cython</span></pre>\n", | |
"<pre class='cython code score-8 '> __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, 2, __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, 2, __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=\"\">03</span>: </pre>\n", | |
"<pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">04</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-8 '> __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, 4, __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, 4, __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=\"\">05</span>: <span class=\"k\">cimport</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">06</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">07</span>: <span class=\"k\">from</span> <span class=\"nn\">cpython.object</span> <span class=\"k\">cimport</span> <span class=\"n\">PyObject</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">08</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">09</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">10</span>: <span class=\"k\">cdef</span> <span class=\"kr\">extern</span> <span class=\"k\">from</span> <span class=\"s\">"Python.h"</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">11</span>: <span class=\"nb\">int</span> <span class=\"n\">PyFloat_CheckExact</span><span class=\"p\">(</span><span class=\"n\">PyObject</span> <span class=\"o\">*</span><span class=\"n\">obj</span><span class=\"p\">)</span> <span class=\"k\">nogil</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">12</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">13</span>: <span class=\"k\">ctypedef</span> <span class=\"k\">struct</span> <span class=\"nc\">PyFloatObject</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">14</span>: <span class=\"n\">double</span> <span class=\"n\">ob_fval</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">15</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">16</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">17</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">boundscheck</span><span class=\"p\">(</span><span class=\"bp\">False</span><span class=\"p\">)</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">18</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">wraparound</span><span class=\"p\">(</span><span class=\"bp\">False</span><span class=\"p\">)</span></pre>\n", | |
"<pre class=\"cython line score-26\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">19</span>: <span class=\"k\">def</span> <span class=\"nf\">sum_object_array_of_floats2</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ndarray</span><span class=\"p\">[</span><span class=\"nb\">object</span><span class=\"p\">]</span> <span class=\"n\">array</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-26 '>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_424dac6e7f458a84e421b1d55c7ab38a_1sum_object_array_of_floats2(PyObject *__pyx_self, PyObject *__pyx_v_array); /*proto*/\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_424dac6e7f458a84e421b1d55c7ab38a_1sum_object_array_of_floats2 = {\"sum_object_array_of_floats2\", (PyCFunction)__pyx_pw_46_cython_magic_424dac6e7f458a84e421b1d55c7ab38a_1sum_object_array_of_floats2, METH_O, 0};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_424dac6e7f458a84e421b1d55c7ab38a_1sum_object_array_of_floats2(PyObject *__pyx_self, PyObject *__pyx_v_array) {\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"sum_object_array_of_floats2 (wrapper)\", 0);\n", | |
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_array), __pyx_ptype_5numpy_ndarray, 1, \"array\", 0))) <span class='error_goto'>__PYX_ERR(0, 19, __pyx_L1_error)</span>\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_424dac6e7f458a84e421b1d55c7ab38a_sum_object_array_of_floats2(__pyx_self, ((PyArrayObject *)__pyx_v_array));\n", | |
" int __pyx_lineno = 0;\n", | |
" const char *__pyx_filename = NULL;\n", | |
" int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" goto __pyx_L0;\n", | |
" __pyx_L1_error:;\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_424dac6e7f458a84e421b1d55c7ab38a_sum_object_array_of_floats2(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_array) {\n", | |
" Py_ssize_t __pyx_v_idx;\n", | |
" unsigned int __pyx_v_n;\n", | |
" double __pyx_v_val;\n", | |
" double __pyx_v_total;\n", | |
" PyObject *__pyx_v_obj;\n", | |
" void **__pyx_v_ptr;\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_array;\n", | |
" __Pyx_Buffer __pyx_pybuffer_array;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"sum_object_array_of_floats2\", 0);\n", | |
" __pyx_pybuffer_array.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_array.refcount = 0;\n", | |
" __pyx_pybuffernd_array.data = NULL;\n", | |
" __pyx_pybuffernd_array.rcbuffer = &__pyx_pybuffer_array;\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_array.rcbuffer->pybuffer, (PyObject*)__pyx_v_array, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) <span class='error_goto'>__PYX_ERR(0, 19, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_pybuffernd_array.diminfo[0].strides = __pyx_pybuffernd_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_array.diminfo[0].shape = __pyx_pybuffernd_array.rcbuffer->pybuffer.shape[0];\n", | |
"/* … */\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n", | |
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n", | |
" __Pyx_PyThreadState_declare\n", | |
" __Pyx_PyThreadState_assign\n", | |
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_array.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_ErrRestore</span>(__pyx_type, __pyx_value, __pyx_tb);}\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_424dac6e7f458a84e421b1d55c7ab38a.sum_object_array_of_floats2\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" goto __pyx_L2;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_array.rcbuffer->pybuffer);\n", | |
" __pyx_L2:;\n", | |
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"/* … */\n", | |
" __pyx_tuple__9 = <span class='py_c_api'>PyTuple_Pack</span>(7, __pyx_n_s_array, __pyx_n_s_idx, __pyx_n_s_n, __pyx_n_s_val, __pyx_n_s_total, __pyx_n_s_obj, __pyx_n_s_ptr);<span class='error_goto'> if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 19, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__9);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__9);\n", | |
"/* … */\n", | |
" __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_424dac6e7f458a84e421b1d55c7ab38a_1sum_object_array_of_floats2, NULL, __pyx_n_s_cython_magic_424dac6e7f458a84e4);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __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_sum_object_array_of_floats2, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 19, __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=\"\">20</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">21</span>: <span class=\"k\">cdef</span> <span class=\"kt\">Py_ssize_t</span> <span class=\"nf\">idx</span></pre>\n", | |
"<pre class=\"cython line score-10\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">22</span>: <span class=\"k\">cdef</span> <span class=\"kt\">unsigned</span> <span class=\"kt\">int</span> <span class=\"nf\">n</span> <span class=\"o\">=</span> <span class=\"n\">array</span><span class=\"o\">.</span><span class=\"n\">size</span></pre>\n", | |
"<pre class='cython code score-10 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_array), __pyx_n_s_size);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyInt_As_unsigned_int</span>(__pyx_t_1); if (unlikely((__pyx_t_2 == (unsigned int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 22, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_v_n = __pyx_t_2;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">23</span>: <span class=\"k\">cdef</span> <span class=\"kt\">double</span> <span class=\"nf\">val</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">24</span>: <span class=\"k\">cdef</span> <span class=\"kt\">double</span> <span class=\"nf\">total</span> <span class=\"o\">=</span> <span class=\"mf\">0.0</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_total = 0.0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">25</span>: <span class=\"k\">cdef</span> <span class=\"kt\">PyObject</span> *<span class=\"nf\">obj</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">26</span>: <span class=\"k\">cdef</span> <span class=\"kt\">void</span> ** <span class=\"nf\">ptr</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">27</span>: <span class=\"n\">ptr</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">void</span> <span class=\"o\">**></span> <span class=\"n\">array</span><span class=\"o\">.</span><span class=\"n\">data</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_ptr = ((void **)__pyx_v_array->data);\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">28</span>: </pre>\n", | |
"<pre class=\"cython line score-6\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">29</span>: <span class=\"k\">with</span> <span class=\"k\">nogil</span><span class=\"p\">:</span></pre>\n", | |
"<pre class='cython code score-6 '> {\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", | |
"/* … */\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_L4_error: {\n", | |
" #ifdef WITH_THREAD\n", | |
" <span class='pyx_c_api'>__Pyx_FastGIL_Forget</span>();\n", | |
" Py_BLOCK_THREADS\n", | |
" #endif\n", | |
" goto __pyx_L1_error;\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=\"\">30</span>: <span class=\"k\">for</span> <span class=\"n\">idx</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_2 = __pyx_v_n;\n", | |
" __pyx_t_3 = __pyx_t_2;\n", | |
" for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {\n", | |
" __pyx_v_idx = __pyx_t_4;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">31</span>: <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">PyObject</span> <span class=\"o\">*></span><span class=\"n\">ptr</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_obj = ((PyObject *)(__pyx_v_ptr[__pyx_v_idx]));\n", | |
"</pre><pre class=\"cython line score-5\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">32</span>: <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">PyFloat_CheckExact</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-5 '> __pyx_t_5 = ((!(<span class='py_c_api'>PyFloat_CheckExact</span>(__pyx_v_obj) != 0)) != 0);\n", | |
" if (__pyx_t_5) {\n", | |
"/* … */\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-4\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">33</span>: <span class=\"k\">with</span> <span class=\"k\">gil</span><span class=\"p\">:</span></pre>\n", | |
"<pre class='cython code score-4 '> {\n", | |
" #ifdef WITH_THREAD\n", | |
" PyGILState_STATE __pyx_gilstate_save = <span class='pyx_c_api'>__Pyx_PyGILState_Ensure</span>();\n", | |
" #endif\n", | |
" /*try:*/ {\n", | |
"/* … */\n", | |
" /*finally:*/ {\n", | |
" __pyx_L12_error: {\n", | |
" #ifdef WITH_THREAD\n", | |
" <span class='pyx_c_api'>__Pyx_PyGILState_Release</span>(__pyx_gilstate_save);\n", | |
" #endif\n", | |
" goto __pyx_L4_error;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-10\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">34</span>: <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s\">"require floats"</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-10 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_TypeError, __pyx_tuple_, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L12_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_Raise</span>(__pyx_t_1, 0, 0, 0);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" <span class='error_goto'>__PYX_ERR(0, 34, __pyx_L12_error)</span>\n", | |
" }\n", | |
"/* … */\n", | |
" __pyx_tuple_ = <span class='py_c_api'>PyTuple_Pack</span>(1, __pyx_kp_u_require_floats);<span class='error_goto'> if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 34, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple_);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple_);\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">35</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">36</span>: <span class=\"n\">val</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\"><</span><span class=\"n\">PyFloatObject</span> <span class=\"o\">*></span><span class=\"n\">obj</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">ob_fval</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_6 = ((PyFloatObject *)__pyx_v_obj)->ob_fval;\n", | |
" __pyx_v_val = __pyx_t_6;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">37</span>: <span class=\"n\">total</span> <span class=\"o\">+=</span> <span class=\"n\">val</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_total = (__pyx_v_total + __pyx_v_val);\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">38</span>: </pre>\n", | |
"<pre class=\"cython line score-6\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">39</span>: <span class=\"k\">return</span> <span class=\"n\">total</span></pre>\n", | |
"<pre class='cython code score-6 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" __pyx_t_1 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_total);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __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", | |
"</pre></div></body></html>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"execution_count": 59, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"%%cython -L /home/joris/miniconda3/envs/geo-dev/lib -I /home/joris/miniconda3/envs/geo-dev/include -a\n", | |
"\n", | |
"import cython\n", | |
"\n", | |
"import numpy as np\n", | |
"cimport numpy as np\n", | |
"\n", | |
"from cpython.object cimport PyObject\n", | |
"\n", | |
"\n", | |
"cdef extern from \"Python.h\":\n", | |
" int PyFloat_CheckExact(PyObject *obj) nogil\n", | |
"\n", | |
" ctypedef struct PyFloatObject:\n", | |
" double ob_fval\n", | |
"\n", | |
"\n", | |
"@cython.boundscheck(False)\n", | |
"@cython.wraparound(False)\n", | |
"def sum_object_array_of_floats2(np.ndarray[object] array):\n", | |
" \n", | |
" cdef Py_ssize_t idx\n", | |
" cdef unsigned int n = array.size\n", | |
" cdef double val\n", | |
" cdef double total = 0.0\n", | |
" cdef PyObject *obj\n", | |
" cdef void ** ptr\n", | |
" ptr = <void **> array.data\n", | |
"\n", | |
" with nogil:\n", | |
" for idx in range(n):\n", | |
" obj = <PyObject *>ptr[idx]\n", | |
" if not PyFloat_CheckExact(obj):\n", | |
" with gil:\n", | |
" raise TypeError(\"require floats\")\n", | |
"\n", | |
" val = (<PyFloatObject *>obj).ob_fval\n", | |
" total += val\n", | |
"\n", | |
" return total" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 60, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"arr = np.arange(0.0, 10.0, 0.5, dtype=object)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 61, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"float" | |
] | |
}, | |
"execution_count": 61, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"type(arr[0])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 62, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"95.0" | |
] | |
}, | |
"execution_count": 62, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"sum_object_array_of_floats2(arr)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python (geo-dev)", | |
"language": "python", | |
"name": "geo-dev" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.8.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment