{
  "__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:benchmarking",
  "arbitrary": [
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Options",
          "__tag": 4034,
          "values": [
            "orphan"
          ]
        }
      ],
      "title": [],
      "level": 0,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "This document introduces benchmarking, including reviewing SciPy\nbenchmark test results online, writing a benchmark test, and running it\nlocally. For a video run-through of writing a test and running it\nlocally, see"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Benchmarking SciPy"
                }
              ],
              "url": "https://youtu.be/edLQ8KRpupQ",
              "title": ""
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "."
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As written in the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "airspeed velocity (asv) documentation"
                }
              ],
              "url": "https://asv.readthedocs.io/en/stable/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ":"
            }
          ]
        },
        {
          "__type": "Blockquote",
          "__tag": 4059,
          "children": [
            {
              "__type": "Paragraph",
              "__tag": 4045,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Airspeed velocity (asv) is a tool for benchmarking Python packages over their  lifetime. Runtime, memory consumption, and even custom-computed values  may be tracked. The results are displayed in an interactive web frontend  that requires only a basic static webserver to host."
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "To see what this means, take a look at "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "airspeed velocity of an unladen scipy"
                }
              ],
              "url": "https://pv.github.io/scipy-bench/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". Each plot summarizes the execution time of a particular test over the commit history of the project; that is, as each commit is merged, the benchmark test is run, its execution time is measured, and the elapsed time is plotted. In addition to tracking the performance of the code, a commit is "
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "intended"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " to affect, running "
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "all"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " benchmarks for each commit is helpful for identifying unintentional regressions: significant increases in the execution time of one or more benchmark tests. As SciPy is a web of interconnected code, the repercussions of a small change may not be immediately obvious to a contributor, so this benchmark suite makes it easier to detect regressions and identify the commit that caused them. When you contribute a substantial new feature - or notice a feature that doesn’t already have a benchmark test - please consider writing benchmarks."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Benchmarking SciPy with airspeed velocity"
        }
      ],
      "level": 0,
      "target": "benchmarking-with-asv"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "The"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " "
            },
            {
              "__type": "InlineRole",
              "__tag": 4003,
              "value": "Writing benchmarks <asv:writing-benchmarks>",
              "domain": null,
              "role": "ref",
              "inventory": null
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " "
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "section of the\nairspeed velocity documentation is the definitive guide to writing benchmarks.\nPlease see also the"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "SciPy benchmarks readme"
                }
              ],
              "url": "https://github.com/scipy/scipy/blob/main/benchmarks/README.rst",
              "title": ""
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "."
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "To see how benchmarks are written, take a look at "
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "|optimize-linprog-py|_"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". Each subclass of "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "Benchmark"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " defines a benchmark test. For example, the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "KleeMinty"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " class defines a benchmark test based on the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Klee-Minty hypercube problem"
                }
              ],
              "url": "https://en.wikipedia.org/wiki/Klee%E2%80%93Minty_cube",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", a diabolical test of the simplex algorithm for linear programming. The class has four parts:"
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "setup"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " prepares the benchmark to run. The execution time of this    function is "
                    },
                    {
                      "__type": "Emphasis",
                      "__tag": 4047,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "not"
                        }
                      ]
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " counted in the benchmark results, so this is a good    place to set up all variables that define the problem. In the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "KleeMinty"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "    example, this involves generating arrays "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "c"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "A_ub"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "b_ub"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "    corresponding with a Klee-Minty hypercube in "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "dims"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " dimensions and    storing them as instance variables."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "time_klee_minty"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " actually runs the benchmark test. This function    executes after a "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "KleeMinty"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " object has been instantiated and    "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "setup"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " has run, so it gets the arrays defining the problem from    "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "self"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ". Note that the prefix "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "time"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " in the function name    indicates to "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "asv"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " that the execution time of this function "
                    },
                    {
                      "__type": "Emphasis",
                      "__tag": 4047,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "is"
                        }
                      ]
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " to    be counted in the benchmark results."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "params"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " is a list of lists defining parameters of the test.    Benchmarks are run for all possible combinations of these parameters.    For example, the first time the benchmark is run, the first element    of "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "methods"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " ("
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "simplex"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ") is passed into "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "setup"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and    "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "time_klee_minty"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " as the first argument, "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "meth"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", and the first    element of "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "[3, 6, 9]"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " ("
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "3"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ") is passed into "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "setup"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and    "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "time_klee_minty"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " as the second argument, "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "dims"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ". The next time    the benchmark is run, "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "setup"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "time_klee_minty"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " are passed    "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "revised simplex"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "6"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " as arguments, and so this continues    until all combinations of parameters have been used."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "param_names"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " is a list of human-readable names for each element of    the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "params"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " list. These are used for presenting results."
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Results of this benchmark over the past few years are available by clicking on the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "KleeMinty.time_klee_minty"
                }
              ],
              "url": "https://pv.github.io/scipy-bench/#optimize_linprog.KleeMinty.time_klee_minty",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " link at "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "airspeed velocity of an unladen scipy"
                }
              ],
              "url": "https://pv.github.io/scipy-bench/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". Note that each trace of the plot corresponds with a combination of benchmark parameters and environment settings (e.g., the Cython version), and that the visibility of the traces can be toggled using the control panel on the left."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Writing benchmarks"
        }
      ],
      "level": 1,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Before beginning, ensure that"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "airspeed velocity"
                }
              ],
              "url": "https://github.com/airspeed-velocity/asv",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " "
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "is\ninstalled."
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "After contributing new benchmarks, you should test them locally before submitting a pull request."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "To run all benchmarks, navigate to the root SciPy directory at the command line and execute     "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "spin bench",
          "execution_status": null
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "where "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "bench"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " activates the benchmark suite instead of the test suite. This builds SciPy and runs the benchmarks. ("
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Note: this could\ntake a while. Benchmarks often take longer to run than unit tests, and\neach benchmark is run multiple times to measure the distribution in\nexecution times."
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")"
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "To run benchmarks from a particular benchmark module, such as "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "optimize_linprog.py"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", simply append the filename without the extension     "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "spin bench -t optimize_linprog",
          "execution_status": null
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "To run a benchmark defined in a class, such as "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "KleeMinty"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " from "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "optimize_linprog.py"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "     "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "spin bench -t optimize_linprog.KleeMinty",
          "execution_status": null
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "To compare benchmark results between the active branch and another, such as "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "main"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "     "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "spin bench --compare main  # select again by `-t optimize_linprog`",
          "execution_status": null
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "All of the commands above display the results in plain text in the console, and the results are not saved for comparison with future commits. For greater control, a graphical view, and to have results saved for future comparison, you can use use the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "asv"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " terminal command directly."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "To use it, navigate to "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "scipy/benchmarks"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " in the console and then execute     "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "asv run",
          "execution_status": null
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This command runs the whole benchmark suite and saves the results for comparison against future commits."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "To run only a single benchmark, such as "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "KleeMinty"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " from "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "optimize_linprog.py"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "     "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "asv run --bench optimize_linprog.KleeMinty",
          "execution_status": null
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "One great feature of "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "asv"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " is that it can automatically run a benchmark not just for the current commit, but for every commit in a range. "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "linprog"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "method='interior-point'"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " was merged into SciPy with commit "
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "|7fa17f2369e0e5ad055b23cc1a5ee079f9e8ca32|_"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", so let’s run the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "KleeMinty"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " benchmark for 10 commits between then and now to track its performance over time     "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "asv run --bench optimize_linprog.KleeMinty --steps 10 7fa17f..",
          "execution_status": null
        },
        {
          "__type": "Admonition",
          "__tag": 4056,
          "kind": "note",
          "base_type": "note",
          "children": [
            {
              "__type": "AdmonitionTitle",
              "__tag": 4055,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "note "
                }
              ]
            },
            {
              "__type": "Paragraph",
              "__tag": 4045,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "This will take a while, because SciPy has to be rebuilt for each commit! To speed up the building process of benchmarks you can install "
                },
                {
                  "__type": "Link",
                  "__tag": 4049,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "ccache"
                    }
                  ],
                  "url": "https://ccache.dev",
                  "title": ""
                },
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": " and "
                },
                {
                  "__type": "Link",
                  "__tag": 4049,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "f90cache"
                    }
                  ],
                  "url": "https://perso.univ-rennes1.fr/edouard.canot/f90cache/",
                  "title": ""
                },
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": ". The benchmark suite will automatically detect them if they are installed in the "
                },
                {
                  "__type": "InlineCode",
                  "__tag": 4051,
                  "value": "/usr/lib"
                },
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": " and "
                },
                {
                  "__type": "InlineCode",
                  "__tag": 4051,
                  "value": "/usr/local/lib"
                },
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": ". Otherwise you must add them to the "
                },
                {
                  "__type": "InlineCode",
                  "__tag": 4051,
                  "value": "PATH"
                },
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": " environment variable."
                }
              ]
            },
            {
              "__type": "Paragraph",
              "__tag": 4045,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "For more information about specifying ranges of commits, see the "
                },
                {
                  "__type": "Link",
                  "__tag": 4049,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "git revisions documentation"
                    }
                  ],
                  "url": "https://git-scm.com/docs/gitrevisions#_specifying_ranges",
                  "title": ""
                },
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "."
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "To \"publish\" the results (prepare them to be viewed) and \"preview\" them in an interactive console     "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "asv publish\nasv preview",
          "execution_status": null
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "ASV will report that it is running a server. Using any browser, you can review the results by navigating to http://127.0.0.1:8080 (local machine, port 8080)."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "For much more information about the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "asv"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " commands, see the airspeed velocity "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Commands"
                }
              ],
              "url": "https://asv.readthedocs.io/en/stable/commands.html#commands",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " documentation. (Tip: check out the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "asv find"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " command and the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "--quick"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "--skip-existing-commits"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "--profile"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " options for "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "asv run"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ".)"
            }
          ]
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "git revisions documentation"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "Commands"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "airspeed velocity"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "Using airspeed velocity"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "Benchmarking SciPy"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "airspeed velocity (asv) documentation"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "airspeed velocity of an unladen scipy"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "SciPy benchmarks readme"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "Klee-Minty hypercube problem"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "KleeMinty.time_klee_minty"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "optimize-linprog-py"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "7fa17f2369e0e5ad055b23cc1a5ee079f9e8ca32"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "ccache"
        },
        {
          "__type": "Target",
          "__tag": 4061,
          "label": "f90cache"
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Running benchmarks locally"
        }
      ],
      "level": 1,
      "target": null
    }
  ],
  "local_refs": []
}