Last active
July 8, 2019 14:30
-
-
Save richardjgowers/dbec308c364aae8b9ca84e8e22171823 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": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"%load_ext cython" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 111, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"warning: /home/richard/.cache/ipython/cython/_cython_magic_31dbdbe3155d800dfc8607685237be56.pyx:22:14: Non-trivial type declarators in shared declaration (e.g. mix of pointers and values). Each pointer declaration should be on its own line.\n", | |
"warning: /home/richard/.cache/ipython/cython/_cython_magic_31dbdbe3155d800dfc8607685237be56.pyx:22:22: Non-trivial type declarators in shared declaration (e.g. mix of pointers and values). Each pointer declaration should be on its own line.\n", | |
"warning: /home/richard/.cache/ipython/cython/_cython_magic_31dbdbe3155d800dfc8607685237be56.pyx:22:31: Non-trivial type declarators in shared declaration (e.g. mix of pointers and values). Each pointer declaration should be on its own line.\n", | |
"warning: /home/richard/.cache/ipython/cython/_cython_magic_31dbdbe3155d800dfc8607685237be56.pyx:22:39: Non-trivial type declarators in shared declaration (e.g. mix of pointers and values). Each pointer declaration should be on its own line.\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<!DOCTYPE html>\n", | |
"<!-- Generated by Cython 0.29.12 -->\n", | |
"<html>\n", | |
"<head>\n", | |
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", | |
" <title>Cython: _cython_magic_31dbdbe3155d800dfc8607685237be56.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.12</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-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">03</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, 3, __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, 3, __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=\"\">04</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">05</span>: <span class=\"k\">from</span> <span class=\"nn\">libc</span> <span class=\"k\">cimport</span> <span class=\"n\">stdio</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">06</span>: <span class=\"k\">from</span> <span class=\"nn\">libc</span> <span class=\"k\">cimport</span> <span class=\"n\">string</span> <span class=\"k\">as</span> <span class=\"n\">cstring</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">07</span>: <span class=\"k\">from</span> <span class=\"nn\">libc</span> <span class=\"k\">cimport</span> <span class=\"n\">stdlib</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">08</span>: <span class=\"k\">from</span> <span class=\"nn\">cpython.int</span> <span class=\"k\">cimport</span> <span class=\"n\">PyInt_FromString</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>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">11</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-0\"> <span class=\"\">12</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-23\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">13</span>: <span class=\"k\">def</span> <span class=\"nf\">read_xyz</span><span class=\"p\">(</span><span class=\"nb\">bytes</span> <span class=\"n\">filename</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-23 '>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_31dbdbe3155d800dfc8607685237be56_1read_xyz(PyObject *__pyx_self, PyObject *__pyx_v_filename); /*proto*/\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_31dbdbe3155d800dfc8607685237be56_1read_xyz = {\"read_xyz\", (PyCFunction)__pyx_pw_46_cython_magic_31dbdbe3155d800dfc8607685237be56_1read_xyz, METH_O, 0};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_31dbdbe3155d800dfc8607685237be56_1read_xyz(PyObject *__pyx_self, PyObject *__pyx_v_filename) {\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"read_xyz (wrapper)\", 0);\n", | |
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_filename), (&PyBytes_Type), 1, \"filename\", 1))) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_31dbdbe3155d800dfc8607685237be56_read_xyz(__pyx_self, ((PyObject*)__pyx_v_filename));\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_31dbdbe3155d800dfc8607685237be56_read_xyz(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_filename) {\n", | |
" FILE *__pyx_v_fp;\n", | |
" char *__pyx_v_line;\n", | |
" PyObject *__pyx_v_n_atoms = 0;\n", | |
" int __pyx_v_i;\n", | |
" int __pyx_v_c_n_atoms;\n", | |
" size_t __pyx_v_read;\n", | |
" char *__pyx_v_delims;\n", | |
" CYTHON_UNUSED char *__pyx_v_first;\n", | |
" char *__pyx_v_second;\n", | |
" char *__pyx_v_third;\n", | |
" char *__pyx_v_fourth;\n", | |
" PyObject *__pyx_v_arr = 0;\n", | |
" __Pyx_memviewslice __pyx_v_c_arr = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"read_xyz\", 0);\n", | |
"/* … */\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_31dbdbe3155d800dfc8607685237be56.read_xyz\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_n_atoms);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_arr);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_c_arr, 1);\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__20 = <span class='py_c_api'>PyTuple_Pack</span>(14, __pyx_n_s_filename, __pyx_n_s_fp, __pyx_n_s_line, __pyx_n_s_n_atoms, __pyx_n_s_i, __pyx_n_s_c_n_atoms, __pyx_n_s_read, __pyx_n_s_delims, __pyx_n_s_first, __pyx_n_s_second, __pyx_n_s_third, __pyx_n_s_fourth, __pyx_n_s_arr, __pyx_n_s_c_arr);<span class='error_goto'> if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__20);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__20);\n", | |
"/* … */\n", | |
" __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_31dbdbe3155d800dfc8607685237be56_1read_xyz, NULL, __pyx_n_s_cython_magic_31dbdbe3155d800dfc);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __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_read_xyz, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_codeobj__21 = (PyObject*)<span class='pyx_c_api'>__Pyx_PyCode_New</span>(1, 0, 14, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_richard_cache_ipython_cyth, __pyx_n_s_read_xyz, 13, __pyx_empty_bytes);<span class='error_goto'> if (unlikely(!__pyx_codeobj__21)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">14</span>: <span class=\"k\">cdef</span> <span class=\"kt\">stdio</span>.<span class=\"kt\">FILE</span>* <span class=\"nf\">fp</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">15</span>: <span class=\"k\">cdef</span> <span class=\"kt\">char</span>* <span class=\"nf\">line</span> <span class=\"o\">=</span> <span class=\"bp\">NULL</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_line = NULL;\n", | |
"</pre><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=\"kt\">object</span> <span class=\"nf\">n_atoms</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">18</span>: <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">i</span><span class=\"p\">,</span> <span class=\"nf\">c_n_atoms</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">19</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">20</span>: <span class=\"k\">cdef</span> <span class=\"kt\">size_t</span> <span class=\"nf\">read</span> <span class=\"o\">=</span> <span class=\"mf\">0</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_read = 0;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">21</span>: <span class=\"k\">cdef</span> <span class=\"kt\">char</span>* <span class=\"nf\">delims</span> <span class=\"o\">=</span> <span class=\"s\">" </span><span class=\"se\">\\t\\n</span><span class=\"s\">"</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_delims = ((char *)\" \\t\\n\");\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">22</span>: <span class=\"k\">cdef</span> <span class=\"kt\">char</span> *<span class=\"nf\">first</span><span class=\"p\">,</span> *<span class=\"nf\">second</span><span class=\"p\">,</span> *<span class=\"nf\">third</span><span class=\"p\">,</span> *<span class=\"nf\">fourth</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">23</span>: </pre>\n", | |
"<pre class=\"cython line score-12\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">24</span>: <span class=\"n\">fp</span> <span class=\"o\">=</span> <span class=\"n\">stdio</span><span class=\"o\">.</span><span class=\"n\">fopen</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"s\">"r"</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-12 '> if (unlikely(__pyx_v_filename == Py_None)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_TypeError, \"expected bytes, NoneType found\");\n", | |
" <span class='error_goto'>__PYX_ERR(0, 24, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyBytes_AsString</span>(__pyx_v_filename); if (unlikely((!__pyx_t_1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 24, __pyx_L1_error)</span>\n", | |
" __pyx_v_fp = fopen(__pyx_t_1, ((char const *)\"r\"));\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">25</span>: <span class=\"k\">if</span> <span class=\"n\">fp</span> <span class=\"o\">==</span> <span class=\"bp\">NULL</span><span class=\"p\">:</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_2 = ((__pyx_v_fp == NULL) != 0);\n", | |
" if (unlikely(__pyx_t_2)) {\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=\"\">26</span>: <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s\">"could not open file"</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-10 '> __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_ValueError, __pyx_tuple_, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_c_api'>__Pyx_Raise</span>(__pyx_t_3, 0, 0, 0);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n", | |
" <span class='error_goto'>__PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
"/* … */\n", | |
" __pyx_tuple_ = <span class='py_c_api'>PyTuple_Pack</span>(1, __pyx_kp_u_could_not_open_file);<span class='error_goto'> if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 26, __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=\"\">27</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">28</span>: <span class=\"n\">read</span> <span class=\"o\">=</span> <span class=\"n\">stdio</span><span class=\"o\">.</span><span class=\"n\">getline</span><span class=\"p\">(</span><span class=\"o\">&</span><span class=\"n\">line</span><span class=\"p\">,</span> <span class=\"o\">&</span><span class=\"n\">read</span><span class=\"p\">,</span> <span class=\"n\">fp</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_read = getline((&__pyx_v_line), (&__pyx_v_read), __pyx_v_fp);\n", | |
"</pre><pre class=\"cython line score-5\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">29</span>: <span class=\"n\">n_atoms</span> <span class=\"o\">=</span> <span class=\"n\">PyInt_FromString</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">,</span> <span class=\"bp\">NULL</span><span class=\"p\">,</span> <span class=\"mf\">10</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-5 '> __pyx_t_3 = <span class='py_c_api'>PyInt_FromString</span>(__pyx_v_line, NULL, 10);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 29, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" __pyx_v_n_atoms = __pyx_t_3;\n", | |
" __pyx_t_3 = 0;\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=\"n\">c_n_atoms</span> <span class=\"o\">=</span> <span class=\"n\">stdlib</span><span class=\"o\">.</span><span class=\"n\">atoi</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_c_n_atoms = atoi(__pyx_v_line);\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">31</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">32</span>: <span class=\"c\"># Allocate memory in np.zeros, then create C-friendly view to this</span></pre>\n", | |
"<pre class=\"cython line score-25\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">33</span>: <span class=\"k\">cdef</span> <span class=\"kt\">object</span> <span class=\"nf\">arr</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"mf\">3</span> <span class=\"o\">*</span> <span class=\"n\">n_atoms</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-25 '> <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_t_4, __pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 33, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s_zeros);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 33, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" __pyx_t_4 = <span class='py_c_api'>PyNumber_Multiply</span>(__pyx_int_3, __pyx_v_n_atoms);<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 33, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" __pyx_t_6 = NULL;\n", | |
" if (CYTHON_UNPACK_METHODS && unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_5))) {\n", | |
" __pyx_t_6 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_5);\n", | |
" if (likely(__pyx_t_6)) {\n", | |
" PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_5);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_5, function);\n", | |
" }\n", | |
" }\n", | |
" __pyx_t_3 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_6, __pyx_t_4) : <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_5, __pyx_t_4);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" if (unlikely(!__pyx_t_3)) <span class='error_goto'>__PYX_ERR(0, 33, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n", | |
" __pyx_v_arr = __pyx_t_3;\n", | |
" __pyx_t_3 = 0;\n", | |
"</pre><pre class=\"cython line score-2\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">34</span>: <span class=\"k\">cdef</span> <span class=\"kt\">double</span>[<span class=\"p\">::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">c_arr</span> <span class=\"o\">=</span> <span class=\"n\">arr</span></pre>\n", | |
"<pre class='cython code score-2 '> __pyx_t_7 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dc_double</span>(__pyx_v_arr, PyBUF_WRITABLE);<span class='error_goto'> if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 34, __pyx_L1_error)</span>\n", | |
" __pyx_v_c_arr = __pyx_t_7;\n", | |
" __pyx_t_7.memview = NULL;\n", | |
" __pyx_t_7.data = NULL;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">35</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">36</span>: <span class=\"c\"># This tight inside loop is pure C (annotation has no yellow lines)</span></pre>\n", | |
"<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\">read</span> <span class=\"o\">=</span> <span class=\"n\">stdio</span><span class=\"o\">.</span><span class=\"n\">getline</span><span class=\"p\">(</span><span class=\"o\">&</span><span class=\"n\">line</span><span class=\"p\">,</span> <span class=\"o\">&</span><span class=\"n\">read</span><span class=\"p\">,</span> <span class=\"n\">fp</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_read = getline((&__pyx_v_line), (&__pyx_v_read), __pyx_v_fp);\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">38</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\">c_n_atoms</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_8 = __pyx_v_c_n_atoms;\n", | |
" __pyx_t_9 = __pyx_t_8;\n", | |
" for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {\n", | |
" __pyx_v_i = __pyx_t_10;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">39</span>: <span class=\"n\">read</span> <span class=\"o\">=</span> <span class=\"n\">stdio</span><span class=\"o\">.</span><span class=\"n\">getline</span><span class=\"p\">(</span><span class=\"o\">&</span><span class=\"n\">line</span><span class=\"p\">,</span> <span class=\"o\">&</span><span class=\"n\">read</span><span class=\"p\">,</span> <span class=\"n\">fp</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_read = getline((&__pyx_v_line), (&__pyx_v_read), __pyx_v_fp);\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\">first</span> <span class=\"o\">=</span> <span class=\"n\">cstring</span><span class=\"o\">.</span><span class=\"n\">strtok</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">,</span> <span class=\"n\">delims</span><span class=\"p\">)</span> <span class=\"c\"># element</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_first = strtok(__pyx_v_line, __pyx_v_delims);\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\">second</span> <span class=\"o\">=</span> <span class=\"n\">cstring</span><span class=\"o\">.</span><span class=\"n\">strtok</span><span class=\"p\">(</span><span class=\"bp\">NULL</span><span class=\"p\">,</span> <span class=\"n\">delims</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_second = strtok(NULL, __pyx_v_delims);\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">43</span>: <span class=\"n\">third</span> <span class=\"o\">=</span> <span class=\"n\">cstring</span><span class=\"o\">.</span><span class=\"n\">strtok</span><span class=\"p\">(</span><span class=\"bp\">NULL</span><span class=\"p\">,</span> <span class=\"n\">delims</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_third = strtok(NULL, __pyx_v_delims);\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">44</span>: <span class=\"n\">fourth</span> <span class=\"o\">=</span> <span class=\"n\">cstring</span><span class=\"o\">.</span><span class=\"n\">strtok</span><span class=\"p\">(</span><span class=\"bp\">NULL</span><span class=\"p\">,</span> <span class=\"n\">delims</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_fourth = strtok(NULL, __pyx_v_delims);\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">45</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">46</span>: <span class=\"n\">c_arr</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"o\">*</span><span class=\"mf\">3</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">stdlib</span><span class=\"o\">.</span><span class=\"n\">atof</span><span class=\"p\">(</span><span class=\"n\">second</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_11 = (__pyx_v_i * 3);\n", | |
" *((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_c_arr.data) + __pyx_t_11)) )) = atof(__pyx_v_second);\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">47</span>: <span class=\"n\">c_arr</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"o\">*</span><span class=\"mf\">3</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">stdlib</span><span class=\"o\">.</span><span class=\"n\">atof</span><span class=\"p\">(</span><span class=\"n\">third</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_12 = ((__pyx_v_i * 3) + 1);\n", | |
" *((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_c_arr.data) + __pyx_t_12)) )) = atof(__pyx_v_third);\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">48</span>: <span class=\"n\">c_arr</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"o\">*</span><span class=\"mf\">3</span> <span class=\"o\">+</span> <span class=\"mf\">2</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">stdlib</span><span class=\"o\">.</span><span class=\"n\">atof</span><span class=\"p\">(</span><span class=\"n\">fourth</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_13 = ((__pyx_v_i * 3) + 2);\n", | |
" *((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_c_arr.data) + __pyx_t_13)) )) = atof(__pyx_v_fourth);\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">49</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">50</span>: <span class=\"n\">stdio</span><span class=\"o\">.</span><span class=\"n\">fclose</span><span class=\"p\">(</span><span class=\"n\">fp</span><span class=\"p\">);</span></pre>\n", | |
"<pre class='cython code score-0 '> (void)(fclose(__pyx_v_fp));\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">51</span>: </pre>\n", | |
"<pre class=\"cython line score-40\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">52</span>: <span class=\"k\">return</span> <span class=\"n\">arr</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">n_atoms</span><span class=\"p\">,</span> <span class=\"mf\">3</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-40 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_arr, __pyx_n_s_reshape);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 52, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" __pyx_t_4 = NULL;\n", | |
" __pyx_t_8 = 0;\n", | |
" if (CYTHON_UNPACK_METHODS && likely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_5))) {\n", | |
" __pyx_t_4 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_5);\n", | |
" if (likely(__pyx_t_4)) {\n", | |
" PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_5);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_4);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_5, function);\n", | |
" __pyx_t_8 = 1;\n", | |
" }\n", | |
" }\n", | |
" #if CYTHON_FAST_PYCALL\n", | |
" if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_5)) {\n", | |
" PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_n_atoms, __pyx_int_3};\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 52, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" } else\n", | |
" #endif\n", | |
" #if CYTHON_FAST_PYCCALL\n", | |
" if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_5)) {\n", | |
" PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_n_atoms, __pyx_int_3};\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 52, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" } else\n", | |
" #endif\n", | |
" {\n", | |
" __pyx_t_6 = <span class='py_c_api'>PyTuple_New</span>(2+__pyx_t_8);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 52, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" if (__pyx_t_4) {\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_4); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;\n", | |
" }\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_n_atoms);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_v_n_atoms);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 0+__pyx_t_8, __pyx_v_n_atoms);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_3);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_3);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 1+__pyx_t_8, __pyx_int_3);\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_5, __pyx_t_6, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 52, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" }\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n", | |
" __pyx_r = __pyx_t_3;\n", | |
" __pyx_t_3 = 0;\n", | |
" goto __pyx_L0;\n", | |
"</pre></div></body></html>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"execution_count": 111, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"%%cython -a\n", | |
"\n", | |
"import cython\n", | |
"import numpy as np\n", | |
"\n", | |
"from libc cimport stdio\n", | |
"from libc cimport string as cstring\n", | |
"from libc cimport stdlib\n", | |
"from cpython.int cimport PyInt_FromString\n", | |
"\n", | |
"\n", | |
"@cython.wraparound(False)\n", | |
"@cython.boundscheck(False)\n", | |
"def read_xyz(bytes filename):\n", | |
" cdef stdio.FILE* fp\n", | |
" cdef char* line = NULL\n", | |
" \n", | |
" cdef object n_atoms\n", | |
" cdef int i, c_n_atoms\n", | |
" \n", | |
" cdef size_t read = 0\n", | |
" cdef char* delims = \" \\t\\n\"\n", | |
" cdef char *first, *second, *third, *fourth\n", | |
" \n", | |
" fp = stdio.fopen(filename, \"r\")\n", | |
" if fp == NULL:\n", | |
" raise ValueError(\"could not open file\")\n", | |
" \n", | |
" read = stdio.getline(&line, &read, fp)\n", | |
" n_atoms = PyInt_FromString(line, NULL, 10)\n", | |
" c_n_atoms = stdlib.atoi(line)\n", | |
" \n", | |
" # Allocate memory in np.zeros, then create C-friendly view to this\n", | |
" cdef object arr = np.zeros(3 * n_atoms)\n", | |
" cdef double[::1] c_arr = arr\n", | |
" \n", | |
" # This tight inside loop is pure C (annotation has no yellow lines)\n", | |
" read = stdio.getline(&line, &read, fp) # comment line\n", | |
" for i in range(c_n_atoms):\n", | |
" read = stdio.getline(&line, &read, fp)\n", | |
" # TODO: error checking on read, if read==0, we didn't get a line\n", | |
" \n", | |
" first = cstring.strtok(line, delims) # element\n", | |
" second = cstring.strtok(NULL, delims)\n", | |
" third = cstring.strtok(NULL, delims)\n", | |
" fourth = cstring.strtok(NULL, delims)\n", | |
" \n", | |
" # TODO: Check second, third, fourth aren't NULL, if they are these tokens were missing\n", | |
" c_arr[i*3] = stdlib.atof(second)\n", | |
" c_arr[i*3 + 1] = stdlib.atof(third)\n", | |
" c_arr[i*3 + 2] = stdlib.atof(fourth)\n", | |
"\n", | |
" stdio.fclose(fp);\n", | |
" \n", | |
" return arr.reshape(n_atoms, 3)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 110, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"528 µs ± 11.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%timeit read_xyz(b'./2r9r-1b.xyz')" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"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.6.7" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment