diff --git a/.github/workflows/push-test.yml b/.github/workflows/push-test.yml index 46696b7..9c1e03a 100644 --- a/.github/workflows/push-test.yml +++ b/.github/workflows/push-test.yml @@ -57,4 +57,68 @@ jobs: # https://github.com/marketplace/actions/install-poetry-action#codecov-upload # ====== - name: Run tests - run: poetry run pytest \ No newline at end of file + run: poetry run pytest + + benchmarks: + name: ASV Benchmarks + needs: test + runs-on: ubuntu-22.04 + strategy: + matrix: + python-version: ["3.9"] + poetry-version: ["1.2.1"] + steps: + # ====== + # Checkout, set up python + # ====== + - name: Check out + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + # ====== + # Install and configure poetry + # ====== + - name: Load cached Poetry installation + id: cached-poetry + uses: actions/cache@v4 + with: + path: ~/.local # the path depends on the OS + key: poetry-${{ matrix.poetry-version }} + - name: Install Poetry + if: steps.cached-poetry.outputs.cache-hit != 'true' + uses: snok/install-poetry@v1 + with: + version: ${{ matrix.poetry-version }} + virtualenvs-create: true + virtualenvs-in-project: true + # ====== + # Load cached venv if cache exists + # Install dependencies if cache does not exist + # ====== + - name: Load cached venv + id: cached-poetry-dependencies-dev + uses: actions/cache@v4 + with: + path: .venv + key: dev-${{ matrix.python-version }}-${{ matrix.poetry-version }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + if: steps.cached-poetry-dependencies-dev.outputs.cache-hit != 'true' + run: poetry install --no-interaction -E dev + # ====== + # Compare benchmarks between master and PR, and fail if any get worse + # ====== + + - name: Setup ASV + run: | + pip install asv + cd asv_bench + asv machine --yes + - name: Check regression + run: | + cd asv_bench + git fetch origin $GITHUB_BASE_REF:base $GITHUB_REF:pr + asv continuous base pr -e diff --git a/.gitignore b/.gitignore index 21ef3e1..c362d7c 100644 --- a/.gitignore +++ b/.gitignore @@ -120,3 +120,11 @@ venv.bak/ # Exploratory work playground/ + +# Unit / Performance Testing # +############################## +asv_bench/.asv/env/ +asv_bench/.asv/html/ +asv_bench/.asv/results/ +asv_bench/derivative/ +test-data.xml diff --git a/asv_bench/asv.conf.json b/asv_bench/asv.conf.json new file mode 100644 index 0000000..fcf0ca6 --- /dev/null +++ b/asv_bench/asv.conf.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "project": "derivative", + "project_url": "https://derivative.readthedocs.io/", + "repo": "..", + "environment_type": "virtualenv", + "env_dir": ".asv/env", + "results_dir": ".asv/results", + "html_dir": ".asv/html", + "show_commit_url": "https://github.com/$OWNER/$REPO/commit/", + "build_command": [ + "python -m build --outdir {build_cache_dir} {build_dir}" + ] +} diff --git a/asv_bench/benchmarks/__init__.py b/asv_bench/benchmarks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/asv_bench/benchmarks/finite_difference_1D.py b/asv_bench/benchmarks/finite_difference_1D.py new file mode 100644 index 0000000..d31149a --- /dev/null +++ b/asv_bench/benchmarks/finite_difference_1D.py @@ -0,0 +1,19 @@ +# Write the benchmarking functions here. +# See "Writing benchmarks" in the asv docs for more information. +import numpy as np +from derivative import FiniteDifference + +class FiniteDifferenceBM: + """ + An example benchmark that times the performance of various kinds + of iterating over dictionaries in Python. + """ + def setup(self): + self.differentiator = FiniteDifference(k=1) + self.t = np.arange(0, 2 * np.pi, .01) + + def time_derivative(self): + self.differentiator.d(X=self.t, t=self.t, axis=0) + + def peakmem_derivative(self): + self.differentiator.d(X=self.t, t=self.t, axis=0) diff --git a/pyproject.toml b/pyproject.toml index e582424..0876f2f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,11 +30,12 @@ matplotlib = {version = "^3.2.1", optional = true} #pandoc = {version = "^2.2", optional = true} # dev +asv = {version = "^0.6", optional = true} pytest = {version = "^7", optional = true} [tool.poetry.extras] docs = ["sphinx", "nbsphinx", "ipykernel", "jupyter_client", "matplotlib", "pandoc"] -dev = ["pytest"] +dev = ["asv", "pytest"] [build-system] requires = ["poetry-core>=1.1.0"]