{
  "__type": "IngestedDoc",
  "__tag": 4010,
  "_content": {},
  "_ordered_sections": [],
  "item_file": null,
  "item_line": null,
  "item_type": null,
  "aliases": [],
  "example_section_data": {
    "__type": "Section",
    "__tag": 4015,
    "children": [],
    "title": [],
    "level": 0,
    "target": null
  },
  "see_also": [],
  "signature": null,
  "references": null,
  "qa": "dev:contributor:cython",
  "arbitrary": [
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As written on the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Cython website"
                }
              ],
              "url": "https://cython.org/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ":"
            }
          ]
        },
        {
          "__type": "Blockquote",
          "__tag": 4059,
          "children": [
            {
              "__type": "Paragraph",
              "__tag": 4045,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Cython is an optimising static  compiler for both the Python programming language and the extended  Cython programming language (based on Pyrex). It makes writing C  extensions for Python as easy as Python itself."
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "If your code currently performs a lot of loops in Python, it might benefit from compilation with Cython. This document is intended to be a very brief introduction: just enough to see how to use Cython with SciPy. Once you have your code compiling, you can learn more about how to optimize it by reviewing the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Cython documentation"
                }
              ],
              "url": "http://docs.cython.org/en/latest/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "There are only two things you need to do in order for SciPy compile your code with Cython:"
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": true,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Include your code in a file with a "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".pyx"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "    extension rather than a "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".py"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " extension. All files with a "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".pyx"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "    extension are automatically converted by Cython to "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".c"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " or "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".cpp"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "    files when SciPy is built."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Add the new "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".pyx"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " file to the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "meson.build"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " build configuration    of the subpackage in which your code lives. Typically, there are already    other "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".pyx"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " patterns present (if not, look in another submodule) so    there's an example to follow for what exact content to add to    "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "meson.build"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "."
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Adding Cython to SciPy"
        }
      ],
      "level": 0,
      "target": "adding-cython"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "|linprog-rs|_"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " contains the implementation of the revised simplex method for "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "scipy.optimize.linprog"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". The revised simplex method performs many elementary row operations on matrices, and so it was a natural candidate to be Cythonized."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Note that "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "scipy/optimize/_linprog_rs.py"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " imports the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "BGLU"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "LU"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " classes from "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "._bglu_dense"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " exactly as if they were regular Python classes. But they’re not. "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "BGLU"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "LU"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " are Cython classes defined in "
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "|bglu-dense|_"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". There is nothing about the way they are imported or used that suggests that they are written in Cython; the only way so far that we can tell they are Cython classes is that they are defined in a file with a "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": ".pyx"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " extension."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Even in "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "/scipy/optimize/_bglu_dense.pyx"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", most of the code resembles Python. The most notable differences are the presence of "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "cimport"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "cdef"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", and "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Cython decorators"
                }
              ],
              "url": "https://cython.readthedocs.io/en/latest/src/userguide/numpy_tutorial.html",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". None of these are strictly necessary. Without them, the pure Python code can still be compiled by Cython. The Cython language extensions are *ust\\* tweaks to improve performance. This "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": ".pyx"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " file is automatically converted to a "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": ".c"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " file by Cython when SciPy is built."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The only thing left is to add the build configuration, which will look something like:"
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "_bglu_dense_c = opt_gen.process('_bglu_dense.pyx')\n\npy3.extension_module('_bglu_dense',\n  _bglu_dense_c,\n  c_args: cython_c_args,\n  dependencies: np_dep,\n  link_args: version_link_args,\n  install: true,\n  subdir: 'scipy/optimize'\n)",
          "execution_status": null
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "When SciPy is built, "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "_bglu_dense.pyx"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " will be transpiled by "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "cython"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " to C code, and then that generated C file is treated by Meson like any other C code in SciPy - producing an extension modules that we will be able to import and use the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "LU"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "BGLU"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " classes from."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Example"
        }
      ],
      "level": 1,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "See a video run-through of this exercise:"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Cythonizing SciPy Code"
                }
              ],
              "url": "https://youtu.be/K9bF7cjUJ7c",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " \\"
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": true,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Update Cython and create a new branch    (e.g., "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "git checkout -b cython_test"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ") in which to make some    experimental changes to SciPy"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Add some simple Python code in a "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".py"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " file in the    "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "/scipy/optimize"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " directory, say "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "/scipy/optimize/mypython.py"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ".    For example:"
                    }
                  ]
                },
                {
                  "__type": "Code",
                  "__tag": 4050,
                  "value": "def myfun():\n    i = 1\n    while i < 10000000:\n        i += 1\n    return i",
                  "execution_status": null
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Let’s see how long this pure-Python loop takes so we can compare the    performance of Cython. For example, in an IPython console in Spyder:"
                    }
                  ]
                },
                {
                  "__type": "Code",
                  "__tag": 4050,
                  "value": "from scipy.optimize.mypython import myfun\n%timeit myfun()",
                  "execution_status": null
                },
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "I get something like:"
                    }
                  ]
                },
                {
                  "__type": "Code",
                  "__tag": 4050,
                  "value": "715 ms ± 10.7 ms per loop",
                  "execution_status": null
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Save your "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".py"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " file to a "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".pyx"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " file, e.g. "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "mycython.pyx"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Add the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".pyx"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " to "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "scipy/optimize/meson.build"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", in the way described in    the previous section."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Rebuild SciPy. Note that an extension module (a "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".so"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " or "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".pyd"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " file)    has been added to the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "build/scipy/optimize/"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " directory."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Time it, e.g. by dropping into IPython with "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "spin ipython"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and then:"
                    }
                  ]
                },
                {
                  "__type": "Code",
                  "__tag": 4050,
                  "value": "from scipy.optimize.mycython import myfun\n%timeit myfun()",
                  "execution_status": null
                },
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "I get something like:"
                    }
                  ]
                },
                {
                  "__type": "Code",
                  "__tag": 4050,
                  "value": "359 ms ± 6.98 ms per loop",
                  "execution_status": null
                },
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Cython sped up the pure Python code by a factor of ~2."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "That’s not much of an improvement in the scheme of things. To see     why, it helps to have Cython create an “annotated” version of our     code to show bottlenecks. In a terminal window, call Cython on your     "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".pyx"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " file with the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "-a"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " flag:"
                    }
                  ]
                },
                {
                  "__type": "Code",
                  "__tag": 4050,
                  "value": "cython -a scipy/optimize/mycython.pyx",
                  "execution_status": null
                },
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Note that this creates a new "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".html"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " file in the     "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "/scipy/optimize"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " directory. Open the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".html"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " file in any     browser."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "The yellow-highlighted lines in the file indicate potential     interaction between the compiled code and Python, which slows things     down considerably. The intensity of the highlighting indicates the     estimated severity of the interaction. In this case, much of the     interaction can be avoided if we define the variable "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "i"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " as an     integer so that Cython doesn’t have to consider the possibility of     it being a general Python object:"
                    }
                  ]
                },
                {
                  "__type": "Code",
                  "__tag": 4050,
                  "value": "def myfun():\n    cdef int i = 1  # our first line of Cython code\n    while i < 10000000:\n        i += 1\n    return i",
                  "execution_status": null
                },
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Recreating the annotated "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": ".html"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " file shows that most of the     Python interaction has disappeared."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Rebuild SciPy, open an fresh IPython console, and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "%timeit"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ":"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "from scipy.optimize.mycython import myfun\n%timeit myfun()",
          "execution_status": null
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "I get something like: "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "68.6 ns ± 1.95 ns per loop"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". The Cython code ran about 10 million times faster than the original Python code."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "In this case, the compiler probably optimized away the loop, simply returning the final result. This sort of speedup is not typical for real code, but this exercise certainly illustrates the power of Cython when the alternative is many low-level operations in Python."
            }
          ]
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "Cython website"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "Cython documentation"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "Cython decorators"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "linprog-rs"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "bglu-dense"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "Cythonizing SciPy Code"
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Exercise"
        }
      ],
      "level": 1,
      "target": null
    }
  ],
  "local_refs": []
}