Skip to content

Instantly share code, notes, and snippets.

@kaczmarj
Created July 7, 2023 17:57
Show Gist options
  • Save kaczmarj/41c351be6f52aa6a553cc12ba98a9103 to your computer and use it in GitHub Desktop.
Save kaczmarj/41c351be6f52aa6a553cc12ba98a9103 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "30a2e806",
"metadata": {},
"source": [
"# Benchmark openslide vs tiffslide\n",
"\n",
"With CMU images from OpenSlide test data, Tiffslide is generally faster than Openslide. With SVS slides from TCGA, however, Tiffslide is much slower."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "cdb427ed",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tiffslide 2.1.2\n",
"openslide 1.2.0\n",
"tifffile 2023.7.4\n",
"numpy 1.25.0\n",
"PIL 9.5.0\n",
"Python 3.10.12 | packaged by conda-forge | (main, Jun 23 2023, 22:40:32) [GCC 12.3.0]\n"
]
}
],
"source": [
"import tiffslide\n",
"import openslide\n",
"import tifffile\n",
"import numpy as np\n",
"import PIL\n",
"\n",
"for m in [tiffslide, openslide, tifffile, np, PIL]:\n",
" print(f\"{m.__name__:<11}{m.__version__}\")\n",
" \n",
"import sys\n",
"print(\"Python\", sys.version)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "43bad576",
"metadata": {},
"outputs": [],
"source": [
"def benchmark(wsi_path):\n",
" t = tiffslide.TiffSlide(wsi_path)\n",
" o = openslide.OpenSlide(wsi_path)\n",
" \n",
" print(\"Openslide -- get thumbnail\")\n",
" %timeit o.get_thumbnail((256, 256))\n",
" print(\"Tiffslide -- get thumbnail\")\n",
" %timeit t.get_thumbnail((256, 256))\n",
" print()\n",
" \n",
" kwargs = dict(location=(20_000, 15_000), level=0, size=(256, 256))\n",
" print(\"Openslide -- read region at level 0\")\n",
" %timeit o.read_region(**kwargs)\n",
" print(\"Tiffslide -- read region at level 0\")\n",
" %timeit t.read_region(**kwargs)\n",
" print()\n",
" \n",
" kwargs = dict(location=(20_000, 15_000), level=2, size=(256, 256))\n",
" print(\"Openslide -- read region at level 2\")\n",
" %timeit o.read_region(**kwargs)\n",
" print(\"Tiffslide -- read region at level 2\")\n",
" %timeit t.read_region(**kwargs)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "c12da821",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Openslide -- get thumbnail\n",
"711 ms ± 18.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"Tiffslide -- get thumbnail\n",
"2.27 s ± 38.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"\n",
"Openslide -- read region at level 0\n",
"1.89 ms ± 17.8 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"Tiffslide -- read region at level 0\n",
"77.5 ms ± 2.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"\n",
"Openslide -- read region at level 2\n",
"6.93 ms ± 250 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"Tiffslide -- read region at level 2\n",
"73.5 ms ± 1.21 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
]
}
],
"source": [
"# From https://portal.gdc.cancer.gov/files/d46167af-6c29-49c7-95cf-3a801181aca4\n",
"benchmark(\"/tmp/tiffslide/images/TCGA-SVS/TCGA-3C-AALI-01Z-00-DX1.F6E9A5DF-D8FB-45CF-B4BD-C6B76294C291.svs\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "e6d1017d",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Openslide -- get thumbnail\n",
"215 ms ± 14.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"Tiffslide -- get thumbnail\n",
"117 ms ± 1.25 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"\n",
"Openslide -- read region at level 0\n",
"1.86 ms ± 20.3 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"Tiffslide -- read region at level 0\n",
"2.46 ms ± 110 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"\n",
"Openslide -- read region at level 2\n",
"6.86 ms ± 149 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"Tiffslide -- read region at level 2\n",
"2.67 ms ± 60 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
]
}
],
"source": [
"# From https://openslide.cs.cmu.edu/download/openslide-testdata/Aperio/CMU-1.svs\n",
"benchmark(\"/tmp/tiffslide/images/Aperio/CMU-1.svs\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "11b22c45",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Openslide -- get thumbnail\n",
"5.03 ms ± 125 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"Tiffslide -- get thumbnail\n",
"5.04 ms ± 158 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"\n",
"Openslide -- read region at level 0\n",
"1.84 ms ± 7.96 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"Tiffslide -- read region at level 0\n",
"1.65 ms ± 30.3 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"\n",
"Openslide -- read region at level 2\n",
"7.09 ms ± 198 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"Tiffslide -- read region at level 2\n",
"1.93 ms ± 22.2 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n"
]
}
],
"source": [
"# From https://openslide.cs.cmu.edu/download/openslide-testdata/Generic-TIFF/CMU-1.tiff\n",
"benchmark(\"/tmp/tiffslide/images/Generic-TIFF/CMU-1.tiff\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8a930846",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment