From 799dfa2c330e5266de8bcd8588a1326c033e302c Mon Sep 17 00:00:00 2001 From: hrodmn Date: Tue, 7 Jan 2025 05:31:52 -0600 Subject: [PATCH] Add query benchmark module and performance docs page - Simulates XYZ tile queries for collections with different item layouts - Adds a new page to docs outlining tradeoffs between number of items and speed of queries - Adds mkdocs-jupyter to the dependencies for the mkdocs site --- .github/workflows/deploy_mkdocs.yml | 2 +- docs/mkdocs.yml | 7 + docs/src/benchmark.json | 4301 ++++++++++++++++++++++++++ docs/src/item_size_analysis.ipynb | 242 ++ src/pypgstac/pyproject.toml | 12 + src/pypgstac/tests/test_benchmark.py | 150 + 6 files changed, 4713 insertions(+), 1 deletion(-) create mode 100644 docs/src/benchmark.json create mode 100644 docs/src/item_size_analysis.ipynb create mode 100644 src/pypgstac/tests/test_benchmark.py diff --git a/.github/workflows/deploy_mkdocs.yml b/.github/workflows/deploy_mkdocs.yml index ad877a0e..0502dec1 100644 --- a/.github/workflows/deploy_mkdocs.yml +++ b/.github/workflows/deploy_mkdocs.yml @@ -27,7 +27,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - python -m pip install mkdocs mkdocs-material + python -m pip install mkdocs mkdocs-material mkdocs-jupyter pandas seaborn - name: Deploy docs run: mkdocs gh-deploy --force -f docs/mkdocs.yml diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index df34f7fd..875999f3 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -20,11 +20,18 @@ nav: - Home: "index.md" - PgSTAC: "pgstac.md" - pyPgSTAC: "pypgstac.md" + - Performance: + - item_size_analysis.ipynb - Development - Contributing: "contributing.md" - Release Notes: "release-notes.md" plugins: - search + - mkdocs-jupyter: + include_source: True + include_requirejs: True + execute: True + show_input: False theme: name: material diff --git a/docs/src/benchmark.json b/docs/src/benchmark.json new file mode 100644 index 00000000..6e6348d1 --- /dev/null +++ b/docs/src/benchmark.json @@ -0,0 +1,4301 @@ +{ + "machine_info": { + "node": "quercus", + "processor": "x86_64", + "machine": "x86_64", + "python_compiler": "GCC 13.2.0", + "python_implementation": "CPython", + "python_implementation_version": "3.12.3", + "python_version": "3.12.3", + "python_build": [ + "main", + "Nov 6 2024 18:32:19" + ], + "release": "6.8.0-51-generic", + "system": "Linux", + "cpu": { + "python_version": "3.12.3.final.0 (64 bit)", + "cpuinfo_version": [ + 9, + 0, + 0 + ], + "cpuinfo_version_string": "9.0.0", + "arch": "X86_64", + "bits": 64, + "count": 16, + "arch_string_raw": "x86_64", + "vendor_id_raw": "AuthenticAMD", + "brand_raw": "AMD Ryzen 7 7840U w/ Radeon 780M Graphics", + "hz_advertised_friendly": "1.7866 GHz", + "hz_actual_friendly": "1.7866 GHz", + "hz_advertised": [ + 1786629000, + 0 + ], + "hz_actual": [ + 1786629000, + 0 + ], + "stepping": 1, + "model": 116, + "family": 25, + "flags": [ + "3dnowext", + "3dnowprefetch", + "abm", + "adx", + "aes", + "amd_lbr_v2", + "aperfmperf", + "apic", + "arat", + "avx", + "avx2", + "avx512_bf16", + "avx512_bitalg", + "avx512_vbmi2", + "avx512_vnni", + "avx512_vpopcntdq", + "avx512bitalg", + "avx512bw", + "avx512cd", + "avx512dq", + "avx512f", + "avx512ifma", + "avx512vbmi", + "avx512vbmi2", + "avx512vl", + "avx512vnni", + "avx512vpopcntdq", + "bmi1", + "bmi2", + "bpext", + "cat_l3", + "cdp_l3", + "clflush", + "clflushopt", + "clwb", + "clzero", + "cmov", + "cmp_legacy", + "constant_tsc", + "cpb", + "cppc", + "cpuid", + "cqm", + "cqm_llc", + "cqm_mbm_local", + "cqm_mbm_total", + "cqm_occup_llc", + "cr8_legacy", + "cx16", + "cx8", + "dbx", + "de", + "decodeassists", + "erms", + "extapic", + "extd_apicid", + "f16c", + "flush_l1d", + "flushbyasid", + "fma", + "fpu", + "fsgsbase", + "fsrm", + "fxsr", + "fxsr_opt", + "gfni", + "ht", + "hw_pstate", + "ibpb", + "ibrs", + "ibrs_enhanced", + "ibs", + "invpcid", + "irperf", + "lahf_lm", + "lbrv", + "lm", + "mba", + "mca", + "mce", + "misalignsse", + "mmx", + "mmxext", + "monitor", + "movbe", + "msr", + "mtrr", + "mwaitx", + "nonstop_tsc", + "nopl", + "npt", + "nrip_save", + "nx", + "ospke", + "osvw", + "osxsave", + "overflow_recov", + "pae", + "pat", + "pausefilter", + "pci_l2i", + "pclmulqdq", + "pdpe1gb", + "perfctr_core", + "perfctr_llc", + "perfctr_nb", + "perfmon_v2", + "pfthreshold", + "pge", + "pku", + "pni", + "popcnt", + "pqe", + "pqm", + "pse", + "pse36", + "rapl", + "rdpid", + "rdpru", + "rdrand", + "rdrnd", + "rdseed", + "rdt_a", + "rdtscp", + "rep_good", + "sep", + "sha", + "sha_ni", + "skinit", + "smap", + "smca", + "smep", + "ssbd", + "sse", + "sse2", + "sse4_1", + "sse4_2", + "sse4a", + "ssse3", + "stibp", + "succor", + "svm", + "svm_lock", + "syscall", + "tce", + "topoext", + "tsc", + "tsc_scale", + "umip", + "user_shstk", + "v_spec_ctrl", + "v_vmsave_vmload", + "vaes", + "vgif", + "vmcb_clean", + "vme", + "vmmcall", + "vnmi", + "vpclmulqdq", + "wbnoinvd", + "wdt", + "x2apic", + "x2avic", + "xgetbv1", + "xsave", + "xsavec", + "xsaveerptr", + "xsaveopt", + "xsaves" + ], + "l3_cache_size": 1048576, + "l2_cache_size": 8388608, + "l1_data_cache_size": 262144, + "l1_instruction_cache_size": 262144, + "l2_cache_line_size": 1024, + "l2_cache_associativity": 6 + } + }, + "commit_info": { + "id": "6da165b7c4f6da321d0b58bbb78da2887763a0d8", + "time": "2024-12-09T10:50:39-06:00", + "author_time": "2024-12-09T10:50:39-06:00", + "dirty": true, + "project": "pgstac", + "branch": "feat/search-benchmarks" + }, + "benchmarks": [ + { + "group": "xyzsearch", + "name": "test1[3-0.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-0.5]", + "params": { + "zoom": 3, + "item_width": 0.5 + }, + "param": "3-0.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 4.781100236999919, + "max": 4.923354106998886, + "mean": 4.84395678366612, + "stddev": 0.07255507461212232, + "rounds": 3, + "median": 4.827416006999556, + "iqr": 0.10669040249922546, + "q1": 4.792679179499828, + "q3": 4.8993695819990535, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 4.781100236999919, + "hd15iqr": 4.923354106998886, + "ops": 0.20644279969053644, + "total": 14.53187035099836, + "data": [ + 4.781100236999919, + 4.827416006999556, + 4.923354106998886 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[3-0.75]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-0.75]", + "params": { + "zoom": 3, + "item_width": 0.75 + }, + "param": "3-0.75", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 2.147751219003112, + "max": 2.1683643510004913, + "mean": 2.158085888334123, + "stddev": 0.010306680943796004, + "rounds": 3, + "median": 2.158142094998766, + "iqr": 0.015459848998034431, + "q1": 2.1503489380020255, + "q3": 2.16580878700006, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 2.147751219003112, + "hd15iqr": 2.1683643510004913, + "ops": 0.4633735874024566, + "total": 6.474257665002369, + "data": [ + 2.1683643510004913, + 2.158142094998766, + 2.147751219003112 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[3-1]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-1]", + "params": { + "zoom": 3, + "item_width": 1 + }, + "param": "3-1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 1.1977020270023786, + "max": 1.2047663939993072, + "mean": 1.2008456296668253, + "stddev": 0.003595734342317445, + "rounds": 3, + "median": 1.2000684679987899, + "iqr": 0.005298275247696438, + "q1": 1.1982936372514814, + "q3": 1.2035919124991779, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 1.1977020270023786, + "hd15iqr": 1.2047663939993072, + "ops": 0.8327465040426971, + "total": 3.6025368890004756, + "data": [ + 1.2047663939993072, + 1.1977020270023786, + 1.2000684679987899 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[3-1.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-1.5]", + "params": { + "zoom": 3, + "item_width": 1.5 + }, + "param": "3-1.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.5610035069985315, + "max": 0.5700876880000578, + "mean": 0.5648575563330572, + "stddev": 0.004695826663797881, + "rounds": 3, + "median": 0.5634814740005822, + "iqr": 0.006813135751144728, + "q1": 0.5616229987490442, + "q3": 0.5684361345001889, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.5610035069985315, + "hd15iqr": 0.5700876880000578, + "ops": 1.7703578340914847, + "total": 1.6945726689991716, + "data": [ + 0.5610035069985315, + 0.5634814740005822, + 0.5700876880000578 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[3-2]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-2]", + "params": { + "zoom": 3, + "item_width": 2 + }, + "param": "3-2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.3394572959987272, + "max": 0.3474930239972309, + "mean": 0.3423380219983301, + "stddev": 0.0035336363516854353, + "rounds": 4, + "median": 0.3412008839986811, + "iqr": 0.004039818997625844, + "q1": 0.34031811249951716, + "q3": 0.344357931497143, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.3394572959987272, + "hd15iqr": 0.3474930239972309, + "ops": 2.921089495588889, + "total": 1.3693520879933203, + "data": [ + 0.3394572959987272, + 0.3474930239972309, + 0.3412228389970551, + 0.3411789290003071 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[3-3]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-3]", + "params": { + "zoom": 3, + "item_width": 3 + }, + "param": "3-3", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.1616739819983195, + "max": 0.1732538390024274, + "mean": 0.1683614392864651, + "stddev": 0.004645194475107718, + "rounds": 7, + "median": 0.16951855400111526, + "iqr": 0.007849024001188809, + "q1": 0.16395422725054232, + "q3": 0.17180325125173113, + "iqr_outliers": 0, + "stddev_outliers": 3, + "outliers": "3;0", + "ld15iqr": 0.1616739819983195, + "hd15iqr": 0.1732538390024274, + "ops": 5.939602347414667, + "total": 1.1785300750052556, + "data": [ + 0.16951855400111526, + 0.17012289500053157, + 0.1732538390024274, + 0.1616739819983195, + 0.16210973700071918, + 0.16948769800001173, + 0.17236337000213098 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[3-4]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-4]", + "params": { + "zoom": 3, + "item_width": 4 + }, + "param": "3-4", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.11248960100056138, + "max": 0.12265536899940344, + "mean": 0.11735441244430452, + "stddev": 0.0035863367674561345, + "rounds": 9, + "median": 0.11760097699880134, + "iqr": 0.00569761775295774, + "q1": 0.1145561129978887, + "q3": 0.12025373075084644, + "iqr_outliers": 0, + "stddev_outliers": 3, + "outliers": "3;0", + "ld15iqr": 0.11248960100056138, + "hd15iqr": 0.12265536899940344, + "ops": 8.52119642688844, + "total": 1.0561897119987407, + "data": [ + 0.11948643000141601, + 0.11310462300025392, + 0.12265536899940344, + 0.11510762000034447, + 0.12055026199959684, + 0.1150399429971003, + 0.11760097699880134, + 0.12015488700126298, + 0.11248960100056138 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[3-5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-5]", + "params": { + "zoom": 3, + "item_width": 5 + }, + "param": "3-5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.08600778799882391, + "max": 0.11819229899992933, + "mean": 0.09380789238415534, + "stddev": 0.008470383289679074, + "rounds": 13, + "median": 0.09278260499922908, + "iqr": 0.009015565500703815, + "q1": 0.08737023674893862, + "q3": 0.09638580224964244, + "iqr_outliers": 1, + "stddev_outliers": 1, + "outliers": "1;1", + "ld15iqr": 0.08600778799882391, + "hd15iqr": 0.11819229899992933, + "ops": 10.66008386485086, + "total": 1.2195026009940193, + "data": [ + 0.0995918389999133, + 0.09643121099725249, + 0.09386423999967519, + 0.09064780799963046, + 0.08600778799882391, + 0.09290014300131588, + 0.09637066600043909, + 0.08746462799899746, + 0.11819229899992933, + 0.09278260499922908, + 0.08708706299876212, + 0.09196810800131061, + 0.08619420299874037 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[3-6]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-6]", + "params": { + "zoom": 3, + "item_width": 6 + }, + "param": "3-6", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.06886182499874849, + "max": 0.08020066499739187, + "mean": 0.0725205675997131, + "stddev": 0.003679136903194388, + "rounds": 15, + "median": 0.07074371199996676, + "iqr": 0.005597590749857773, + "q1": 0.06958281574952707, + "q3": 0.07518040649938484, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.06886182499874849, + "hd15iqr": 0.08020066499739187, + "ops": 13.789191578306898, + "total": 1.0878085139956966, + "data": [ + 0.07045519399980549, + 0.07074371199996676, + 0.06936405300075421, + 0.06957183299891767, + 0.07550127799913753, + 0.078494495999621, + 0.08020066499739187, + 0.07361344899982214, + 0.07421779200012679, + 0.07616023700029473, + 0.06961576400135527, + 0.06898055299825501, + 0.07236440099950414, + 0.06966326200199546, + 0.06886182499874849 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[3-8]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-8]", + "params": { + "zoom": 3, + "item_width": 8 + }, + "param": "3-8", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.05374020599992946, + "max": 0.05982637700071791, + "mean": 0.0563469560555758, + "stddev": 0.0016293739578158342, + "rounds": 18, + "median": 0.05618607450014679, + "iqr": 0.0021514159998332616, + "q1": 0.05518398200001684, + "q3": 0.0573353979998501, + "iqr_outliers": 0, + "stddev_outliers": 4, + "outliers": "4;0", + "ld15iqr": 0.05374020599992946, + "hd15iqr": 0.05982637700071791, + "ops": 17.747187603420596, + "total": 1.0142452090003644, + "data": [ + 0.055682651000097394, + 0.05374020599992946, + 0.05650308599797427, + 0.059472557997651165, + 0.05982637700071791, + 0.057392383001570124, + 0.056449657000484876, + 0.055928424997546244, + 0.05518398200001684, + 0.05479692000153591, + 0.0573353979998501, + 0.057961112001066795, + 0.055098496999562485, + 0.05566840800020145, + 0.05707300100038992, + 0.05644372400274733, + 0.055237412998394575, + 0.05445141100062756 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[3-10]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[3-10]", + "params": { + "zoom": 3, + "item_width": 10 + }, + "param": "3-10", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.047568563000822905, + "max": 0.05683792700074264, + "mean": 0.05166188815055648, + "stddev": 0.0025601894529204182, + "rounds": 20, + "median": 0.05139943300127925, + "iqr": 0.002679176501260372, + "q1": 0.05012959849955223, + "q3": 0.0528087750008126, + "iqr_outliers": 1, + "stddev_outliers": 6, + "outliers": "6;1", + "ld15iqr": 0.047568563000822905, + "hd15iqr": 0.05683792700074264, + "ops": 19.356628954128315, + "total": 1.0332377630111296, + "data": [ + 0.05180252200079849, + 0.048698882001190213, + 0.049534752000909066, + 0.050387244002195075, + 0.05197231200145325, + 0.05162442900109454, + 0.056070921000355156, + 0.047568563000822905, + 0.05047629700129619, + 0.05343033399913111, + 0.04820377700161771, + 0.05592725600217818, + 0.05117443700146396, + 0.05683792700074264, + 0.049871952996909386, + 0.05052141399937682, + 0.051092513000185136, + 0.0516481759987073, + 0.05420683799820836, + 0.0521872160024941 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-0.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-0.5]", + "params": { + "zoom": 4, + "item_width": 0.5 + }, + "param": "4-0.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 1.1995517129980726, + "max": 1.2396531550002692, + "mean": 1.2173349196661245, + "stddev": 0.020431746778374022, + "rounds": 3, + "median": 1.2127998910000315, + "iqr": 0.030076081501647423, + "q1": 1.2028637574985623, + "q3": 1.2329398390002098, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 1.1995517129980726, + "hd15iqr": 1.2396531550002692, + "ops": 0.8214666184670588, + "total": 3.6520047589983733, + "data": [ + 1.2396531550002692, + 1.1995517129980726, + 1.2127998910000315 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-0.75]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-0.75]", + "params": { + "zoom": 4, + "item_width": 0.75 + }, + "param": "4-0.75", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.5314996209999663, + "max": 0.5415407899999991, + "mean": 0.5360264716667492, + "stddev": 0.0050928958379338005, + "rounds": 3, + "median": 0.5350390040002821, + "iqr": 0.007530876750024618, + "q1": 0.5323844667500452, + "q3": 0.5399153435000699, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.5314996209999663, + "hd15iqr": 0.5415407899999991, + "ops": 1.8655795055989435, + "total": 1.6080794150002475, + "data": [ + 0.5350390040002821, + 0.5314996209999663, + 0.5415407899999991 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-1]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-1]", + "params": { + "zoom": 4, + "item_width": 1 + }, + "param": "4-1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.326569004002522, + "max": 0.3346178480023809, + "mean": 0.32932656225148094, + "stddev": 0.003615016240426719, + "rounds": 4, + "median": 0.3280596985005104, + "iqr": 0.004467878499781364, + "q1": 0.32709262300159025, + "q3": 0.3315605015013716, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.326569004002522, + "hd15iqr": 0.3346178480023809, + "ops": 3.036499677291072, + "total": 1.3173062490059237, + "data": [ + 0.326569004002522, + 0.3285031550003623, + 0.32761624200065853, + 0.3346178480023809 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-1.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-1.5]", + "params": { + "zoom": 4, + "item_width": 1.5 + }, + "param": "4-1.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.17086795599971083, + "max": 0.18105750900213025, + "mean": 0.17587526450127675, + "stddev": 0.004035728323823642, + "rounds": 6, + "median": 0.17464539750108088, + "iqr": 0.006878126998344669, + "q1": 0.17357860000265646, + "q3": 0.18045672700100113, + "iqr_outliers": 0, + "stddev_outliers": 3, + "outliers": "3;0", + "ld15iqr": 0.17086795599971083, + "hd15iqr": 0.18105750900213025, + "ops": 5.685847881085863, + "total": 1.0552515870076604, + "data": [ + 0.17497487199943862, + 0.17431592300272314, + 0.17086795599971083, + 0.17357860000265646, + 0.18105750900213025, + 0.18045672700100113 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-2]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-2]", + "params": { + "zoom": 4, + "item_width": 2 + }, + "param": "4-2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.11330923400237225, + "max": 0.14413199599948712, + "mean": 0.1252486348890266, + "stddev": 0.009915628744136859, + "rounds": 9, + "median": 0.1253533779999998, + "iqr": 0.013842049500453868, + "q1": 0.11569722474996524, + "q3": 0.1295392742504191, + "iqr_outliers": 0, + "stddev_outliers": 3, + "outliers": "3;0", + "ld15iqr": 0.11330923400237225, + "hd15iqr": 0.14413199599948712, + "ops": 7.984118955755683, + "total": 1.1272377140012395, + "data": [ + 0.1253533779999998, + 0.11330923400237225, + 0.12463980100073968, + 0.1159379529999569, + 0.11497503999999026, + 0.12647421499787015, + 0.12787050000042655, + 0.14413199599948712, + 0.1345455970003968 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-3]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-3]", + "params": { + "zoom": 4, + "item_width": 3 + }, + "param": "4-3", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.06794780299969716, + "max": 0.07971649299724959, + "mean": 0.07236937333267027, + "stddev": 0.0032234028131627192, + "rounds": 15, + "median": 0.07156555899928208, + "iqr": 0.004010758501863165, + "q1": 0.0702488237475336, + "q3": 0.07425958224939677, + "iqr_outliers": 0, + "stddev_outliers": 4, + "outliers": "4;0", + "ld15iqr": 0.06794780299969716, + "hd15iqr": 0.07971649299724959, + "ops": 13.817999990177643, + "total": 1.085540599990054, + "data": [ + 0.07195737400252256, + 0.07060383200223441, + 0.07430707499952405, + 0.06810927799961064, + 0.07010990799972205, + 0.07129841300047701, + 0.07156555899928208, + 0.07971649299724959, + 0.07411710399901494, + 0.07689898899843683, + 0.07484374299747287, + 0.06794780299969716, + 0.07022745199719793, + 0.07031293899854063, + 0.07352463799907127 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-4]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-4]", + "params": { + "zoom": 4, + "item_width": 4 + }, + "param": "4-4", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.055022680997353746, + "max": 0.07121412800188409, + "mean": 0.0596297509411456, + "stddev": 0.004634585881486992, + "rounds": 17, + "median": 0.05803015600031358, + "iqr": 0.0026907579995167907, + "q1": 0.05688350125001307, + "q3": 0.05957425924952986, + "iqr_outliers": 3, + "stddev_outliers": 3, + "outliers": "3;3", + "ld15iqr": 0.055022680997353746, + "hd15iqr": 0.06487147699954221, + "ops": 16.77015221792553, + "total": 1.0137057659994753, + "data": [ + 0.05694494400086114, + 0.05621355599942035, + 0.06983209000100032, + 0.07121412800188409, + 0.06487147699954221, + 0.059164040998439305, + 0.060804914002801524, + 0.056618432001414476, + 0.05837447899830295, + 0.055022680997353746, + 0.057981475998531096, + 0.05858107200037921, + 0.0578116910000972, + 0.05820825400223839, + 0.05803015600031358, + 0.05669917299746885, + 0.05733320199942682 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-5]", + "params": { + "zoom": 4, + "item_width": 5 + }, + "param": "4-5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.048144559001229936, + "max": 0.05387930500000948, + "mean": 0.05032130766700166, + "stddev": 0.0013144622688698053, + "rounds": 21, + "median": 0.050033582003379706, + "iqr": 0.0009133455005212454, + "q1": 0.049734376998458174, + "q3": 0.05064772249897942, + "iqr_outliers": 3, + "stddev_outliers": 3, + "outliers": "3;3", + "ld15iqr": 0.04908135299774585, + "hd15iqr": 0.0535943450013292, + "ops": 19.872297568605372, + "total": 1.0567474610070349, + "data": [ + 0.0535943450013292, + 0.05037315099980333, + 0.049767618998885155, + 0.05091931800052407, + 0.05014399900028366, + 0.050104821002605604, + 0.05055837699910626, + 0.049749811998481164, + 0.04908135299774585, + 0.049688071998389205, + 0.050033582003379706, + 0.0509157589985989, + 0.050990560001082486, + 0.04938530599974911, + 0.049980152001808165, + 0.04927488500106847, + 0.04977712100298959, + 0.048144559001229936, + 0.04999440000028699, + 0.050390964999678545, + 0.05387930500000948 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-6]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-6]", + "params": { + "zoom": 4, + "item_width": 6 + }, + "param": "4-6", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.043895156999496976, + "max": 0.04860524800096755, + "mean": 0.046354956408487684, + "stddev": 0.0013497296070651744, + "rounds": 22, + "median": 0.04642711300039082, + "iqr": 0.0015482629969483241, + "q1": 0.04566782300025807, + "q3": 0.04721608599720639, + "iqr_outliers": 0, + "stddev_outliers": 8, + "outliers": "8;0", + "ld15iqr": 0.043895156999496976, + "hd15iqr": 0.04860524800096755, + "ops": 21.572666171613484, + "total": 1.019809040986729, + "data": [ + 0.04666873200039845, + 0.04600739599845838, + 0.045710566999332514, + 0.04721608599720639, + 0.043895156999496976, + 0.04667348099974333, + 0.04566782300025807, + 0.04652031700243242, + 0.04593021999971825, + 0.04669129100147984, + 0.04403644800186157, + 0.04860524800096755, + 0.04782636699746945, + 0.04569038199770148, + 0.04524751200005994, + 0.04787148499963223, + 0.04827398699853802, + 0.046333908998349216, + 0.04409462699914002, + 0.04688363699824549, + 0.04830604399830918, + 0.04565832499793032 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-8]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-8]", + "params": { + "zoom": 4, + "item_width": 8 + }, + "param": "4-8", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.03777335199993104, + "max": 0.0432480769995891, + "mean": 0.04046258422170434, + "stddev": 0.0014892429420970946, + "rounds": 27, + "median": 0.04061341799751972, + "iqr": 0.0017895870014399407, + "q1": 0.03936346749924269, + "q3": 0.04115305450068263, + "iqr_outliers": 0, + "stddev_outliers": 9, + "outliers": "9;0", + "ld15iqr": 0.03777335199993104, + "hd15iqr": 0.0432480769995891, + "ops": 24.714190139729013, + "total": 1.092489773986017, + "data": [ + 0.039341798998066224, + 0.0414837219977926, + 0.038832438996905694, + 0.0399212099982833, + 0.03942847300277208, + 0.04115958400143427, + 0.04072858699873905, + 0.0432480769995891, + 0.041842292001092574, + 0.03887399599989294, + 0.03982503799852566, + 0.03982266300226911, + 0.039465280999138486, + 0.04093755499707186, + 0.039434409998648334, + 0.04061341799751972, + 0.038854998998431256, + 0.04075708299933467, + 0.04294649800067418, + 0.04074164800113067, + 0.03777335199993104, + 0.039088900997739984, + 0.04110259200024302, + 0.038892993001354625, + 0.043079480001324555, + 0.04113346599842771, + 0.04316021799968439 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[4-10]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[4-10]", + "params": { + "zoom": 4, + "item_width": 10 + }, + "param": "4-10", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.03276643600111129, + "max": 0.03718326400121441, + "mean": 0.03496493973090345, + "stddev": 0.001112401201614798, + "rounds": 26, + "median": 0.03509476799990807, + "iqr": 0.0016206899999815505, + "q1": 0.03410217000055127, + "q3": 0.03572286000053282, + "iqr_outliers": 0, + "stddev_outliers": 8, + "outliers": "8;0", + "ld15iqr": 0.03276643600111129, + "hd15iqr": 0.03718326400121441, + "ops": 28.600077897922386, + "total": 0.9090884330034896, + "data": [ + 0.03396681500089471, + 0.03627852499994333, + 0.035353603001567535, + 0.03601612800048315, + 0.03626427700146451, + 0.03524199599996791, + 0.03479556399906869, + 0.034837120001611765, + 0.03572286000053282, + 0.033217616997717414, + 0.03414016399983666, + 0.03410217000055127, + 0.03650292800011812, + 0.03567655399820069, + 0.03583802900175215, + 0.03504727499966975, + 0.03346695399886812, + 0.03514226100014639, + 0.03276643600111129, + 0.03558394300125656, + 0.03486442800203804, + 0.03718326400121441, + 0.03358331300114514, + 0.03385520899973926, + 0.03416866199768265, + 0.0354723379969073 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-0.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-0.5]", + "params": { + "zoom": 5, + "item_width": 0.5 + }, + "param": "5-0.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.3528902499965625, + "max": 0.3613380259994301, + "mean": 0.3563750256653293, + "stddev": 0.00441362560369112, + "rounds": 3, + "median": 0.3548968009999953, + "iqr": 0.00633583200215071, + "q1": 0.3533918877474207, + "q3": 0.3597277197495714, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.3528902499965625, + "hd15iqr": 0.3613380259994301, + "ops": 2.8060327688032127, + "total": 1.069125076995988, + "data": [ + 0.3548968009999953, + 0.3613380259994301, + 0.3528902499965625 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-0.75]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-0.75]", + "params": { + "zoom": 5, + "item_width": 0.75 + }, + "param": "5-0.75", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.1738603650010191, + "max": 0.18968734400186804, + "mean": 0.1816396906663916, + "stddev": 0.006070635494990262, + "rounds": 6, + "median": 0.1798818664992723, + "iqr": 0.00968734199705068, + "q1": 0.17841967999993358, + "q3": 0.18810702199698426, + "iqr_outliers": 0, + "stddev_outliers": 3, + "outliers": "3;0", + "ld15iqr": 0.1738603650010191, + "hd15iqr": 0.18968734400186804, + "ops": 5.50540466310664, + "total": 1.0898381439983496, + "data": [ + 0.1738603650010191, + 0.17841967999993358, + 0.18043218900129432, + 0.17933154399725026, + 0.18810702199698426, + 0.18968734400186804 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-1]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-1]", + "params": { + "zoom": 5, + "item_width": 1 + }, + "param": "5-1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.11908579000009922, + "max": 0.14131123699917225, + "mean": 0.13000069355580812, + "stddev": 0.009213577351100307, + "rounds": 9, + "median": 0.1281640450033592, + "iqr": 0.019572380000681733, + "q1": 0.12101755949879589, + "q3": 0.14058993949947762, + "iqr_outliers": 0, + "stddev_outliers": 5, + "outliers": "5;0", + "ld15iqr": 0.11908579000009922, + "hd15iqr": 0.14131123699917225, + "ops": 7.69226665372142, + "total": 1.1700062420022732, + "data": [ + 0.12073260299803223, + 0.12111254499905044, + 0.11908579000009922, + 0.1252064270011033, + 0.14116875800027628, + 0.1281640450033592, + 0.13282783700196887, + 0.14131123699917225, + 0.1403969999992114 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-1.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-1.5]", + "params": { + "zoom": 5, + "item_width": 1.5 + }, + "param": "5-1.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.07683741799701238, + "max": 0.08334037099848501, + "mean": 0.07977976357064367, + "stddev": 0.001969583375656267, + "rounds": 14, + "median": 0.0792417389984621, + "iqr": 0.003077533001487609, + "q1": 0.0782598229998257, + "q3": 0.08133735600131331, + "iqr_outliers": 0, + "stddev_outliers": 3, + "outliers": "3;0", + "ld15iqr": 0.07683741799701238, + "hd15iqr": 0.08334037099848501, + "ops": 12.534506938147496, + "total": 1.1169166899890115, + "data": [ + 0.07964304999768501, + 0.07898171299893875, + 0.0782598229998257, + 0.08133735600131331, + 0.0809538520006754, + 0.07811615699756658, + 0.08290818000023137, + 0.08173985699977493, + 0.07891759799895226, + 0.0780294860014692, + 0.07683741799701238, + 0.07950176499798545, + 0.07835006399909616, + 0.08334037099848501 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-2]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-2]", + "params": { + "zoom": 5, + "item_width": 2 + }, + "param": "5-2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.05488625500220223, + "max": 0.0652931129989156, + "mean": 0.05818601472209492, + "stddev": 0.0029684394659227147, + "rounds": 18, + "median": 0.057458582497929456, + "iqr": 0.0033470590024080593, + "q1": 0.05617568099842174, + "q3": 0.0595227400008298, + "iqr_outliers": 2, + "stddev_outliers": 4, + "outliers": "4;2", + "ld15iqr": 0.05488625500220223, + "hd15iqr": 0.06502834500133758, + "ops": 17.18626038879186, + "total": 1.0473482649977086, + "data": [ + 0.05642501900001662, + 0.0652931129989156, + 0.05617568099842174, + 0.05500854599813465, + 0.05781774499700987, + 0.05565800999829662, + 0.05653662999975495, + 0.05488625500220223, + 0.05593465900165029, + 0.05695694200039725, + 0.05792698200093582, + 0.0595227400008298, + 0.05911192699932144, + 0.05862750099913683, + 0.059550049001700245, + 0.06502834500133758, + 0.05978870100079803, + 0.057099419998849044 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-3]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-3]", + "params": { + "zoom": 5, + "item_width": 3 + }, + "param": "5-3", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.04489852500046254, + "max": 0.05440302599890856, + "mean": 0.048053970475891786, + "stddev": 0.002020601273945267, + "rounds": 21, + "median": 0.047797962000913685, + "iqr": 0.0021989167489664396, + "q1": 0.04697752375068376, + "q3": 0.0491764404996502, + "iqr_outliers": 1, + "stddev_outliers": 5, + "outliers": "5;1", + "ld15iqr": 0.04489852500046254, + "hd15iqr": 0.05440302599890856, + "ops": 20.80993495639846, + "total": 1.0091333799937274, + "data": [ + 0.04763054699651548, + 0.04489852500046254, + 0.047797962000913685, + 0.04580801299744053, + 0.04957300499881967, + 0.04843555300249136, + 0.04801880300146877, + 0.049190688998351106, + 0.04728741300277761, + 0.049315358002786525, + 0.048169592999329325, + 0.047464323997701285, + 0.05080188200008706, + 0.046753120001085335, + 0.0470523250005499, + 0.04726841699812212, + 0.04648834699764848, + 0.05440302599890856, + 0.04917169100008323, + 0.04577358000096865, + 0.047831206997216213 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-4]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-4]", + "params": { + "zoom": 5, + "item_width": 4 + }, + "param": "5-4", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.03521118299977388, + "max": 0.042654497003240976, + "mean": 0.038113435110938516, + "stddev": 0.0017210758691116373, + "rounds": 27, + "median": 0.037680810997699155, + "iqr": 0.0016856995016496512, + "q1": 0.03702540874837723, + "q3": 0.03871110825002688, + "iqr_outliers": 2, + "stddev_outliers": 8, + "outliers": "8;2", + "ld15iqr": 0.03521118299977388, + "hd15iqr": 0.04135794299872941, + "ops": 26.237467105477485, + "total": 1.02906274799534, + "data": [ + 0.03717857399897184, + 0.04093288200238021, + 0.037019471998064546, + 0.039954528998350725, + 0.037556142000539694, + 0.04005070199855254, + 0.03872921500078519, + 0.042654497003240976, + 0.038476314999570604, + 0.03755851599999005, + 0.03729255600046599, + 0.03865678799775196, + 0.037043218999315286, + 0.03655166799944709, + 0.03736498299986124, + 0.03565524099758477, + 0.03813792900109547, + 0.03521118299977388, + 0.03823172700140276, + 0.03802275899943197, + 0.03685324800244416, + 0.03694704699955764, + 0.037680810997699155, + 0.04135794299872941, + 0.03627146300277673, + 0.03928250799799571, + 0.03839083099956042 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-5]", + "params": { + "zoom": 5, + "item_width": 5 + }, + "param": "5-5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.03793965599834337, + "max": 0.04555513000013889, + "mean": 0.04055096839983889, + "stddev": 0.001934729870115932, + "rounds": 30, + "median": 0.04005605349993857, + "iqr": 0.0014117259997874498, + "q1": 0.03940837000118336, + "q3": 0.04082009600097081, + "iqr_outliers": 4, + "stddev_outliers": 7, + "outliers": "7;4", + "ld15iqr": 0.03793965599834337, + "hd15iqr": 0.04337045899956138, + "ops": 24.66032352519534, + "total": 1.2165290519951668, + "data": [ + 0.03940837000118336, + 0.03993316499690991, + 0.040693049999390496, + 0.04137338500004262, + 0.040091078997647855, + 0.04555513000013889, + 0.04147193300013896, + 0.03979306199835264, + 0.039633960001083324, + 0.04014094599915552, + 0.03979187299773912, + 0.03993672700016759, + 0.040509015998395626, + 0.04054226000152994, + 0.04337045899956138, + 0.03941786699942895, + 0.040662180002982495, + 0.038028702001611236, + 0.03920414999811328, + 0.04003408700009459, + 0.045365158999629784, + 0.03905455000131042, + 0.040078019999782555, + 0.038662733997625764, + 0.04082009600097081, + 0.042519153001194354, + 0.04443430100218393, + 0.03793965599834337, + 0.03873634800038417, + 0.039327634000073886 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-6]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-6]", + "params": { + "zoom": 5, + "item_width": 6 + }, + "param": "5-6", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.032226272000116296, + "max": 0.039702834001218434, + "mean": 0.03612378748385386, + "stddev": 0.0015639443296231721, + "rounds": 31, + "median": 0.03627503800089471, + "iqr": 0.0017682202478681575, + "q1": 0.03527353050230886, + "q3": 0.037041750750177016, + "iqr_outliers": 2, + "stddev_outliers": 8, + "outliers": "8;2", + "ld15iqr": 0.03333166900119977, + "hd15iqr": 0.039702834001218434, + "ops": 27.682590050862384, + "total": 1.1198374119994696, + "data": [ + 0.03657423999902676, + 0.03635696099809138, + 0.03394788699733908, + 0.03865205299734953, + 0.035572141998272855, + 0.03539641799943638, + 0.03511977200105321, + 0.037492039999051485, + 0.03589865500180167, + 0.03558995099956519, + 0.035221881000325084, + 0.03523375500299153, + 0.03443706300095073, + 0.03573005499856663, + 0.03539285700026085, + 0.037199960999714676, + 0.03654574699976365, + 0.032226272000116296, + 0.03487518600013573, + 0.03635221399963484, + 0.0382186829992861, + 0.03577517599842395, + 0.038712609002686804, + 0.03627503800089471, + 0.03629640900180675, + 0.03712872200048878, + 0.03653862300052424, + 0.03333166900119977, + 0.03698030699888477, + 0.037062232000607764, + 0.039702834001218434 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-8]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-8]", + "params": { + "zoom": 5, + "item_width": 8 + }, + "param": "5-8", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.030467855001916178, + "max": 0.03646382800070569, + "mean": 0.03345623115592389, + "stddev": 0.0012971261642753505, + "rounds": 32, + "median": 0.033450998498665285, + "iqr": 0.0016723429998819483, + "q1": 0.03265430600004038, + "q3": 0.03432664899992233, + "iqr_outliers": 0, + "stddev_outliers": 8, + "outliers": "8;0", + "ld15iqr": 0.030467855001916178, + "hd15iqr": 0.03646382800070569, + "ops": 29.889798266262165, + "total": 1.0705993969895644, + "data": [ + 0.03300872199906735, + 0.033955015998799354, + 0.03407256100035738, + 0.03350977099762531, + 0.03443825599970296, + 0.033723488999385154, + 0.033799476997955935, + 0.03339222599970526, + 0.03351808200022788, + 0.032727325000450946, + 0.03438245200231904, + 0.03174541200132808, + 0.03243880700028967, + 0.03119449600126245, + 0.03338629100107937, + 0.03163974199924269, + 0.030467855001916178, + 0.03351452199785854, + 0.03527769399806857, + 0.03313814099965384, + 0.03427084599752561, + 0.03279144299813197, + 0.03513284099972225, + 0.03254091800044989, + 0.03258128699962981, + 0.03308114999890677, + 0.03646382800070569, + 0.03286386999752722, + 0.034547491999546764, + 0.03583811000135029, + 0.032556353999098064, + 0.034600921000674134 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[5-10]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[5-10]", + "params": { + "zoom": 5, + "item_width": 10 + }, + "param": "5-10", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.03186058700157446, + "max": 0.039468946000852156, + "mean": 0.036132189964389126, + "stddev": 0.0015354948988810695, + "rounds": 28, + "median": 0.0361070445014775, + "iqr": 0.0010786809998535318, + "q1": 0.035639239500596887, + "q3": 0.03671792050045042, + "iqr_outliers": 4, + "stddev_outliers": 7, + "outliers": "7;4", + "ld15iqr": 0.03407731799961766, + "hd15iqr": 0.03914836900003138, + "ops": 27.676152510699513, + "total": 1.0117013190028956, + "data": [ + 0.03186058700157446, + 0.03628336000110721, + 0.03606133100038278, + 0.03678203500021482, + 0.034916751999844564, + 0.03575975299827405, + 0.03663480899922433, + 0.036408030002348823, + 0.03615038200223353, + 0.03407731799961766, + 0.03781619399887859, + 0.03565883000192116, + 0.039468946000852156, + 0.03572532099860837, + 0.03914836900003138, + 0.03829468500043731, + 0.03606370700072148, + 0.03556978099732078, + 0.03700169099829509, + 0.0358013100012613, + 0.03665380600068602, + 0.036865149002551334, + 0.03629761000047438, + 0.03508416700060479, + 0.03599721799764666, + 0.036259615000744816, + 0.03561964899927261, + 0.033440913997765165 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-0.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-0.5]", + "params": { + "zoom": 6, + "item_width": 0.5 + }, + "param": "6-0.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.1268487230008759, + "max": 0.14295829899856471, + "mean": 0.1350773039998785, + "stddev": 0.005595496365896534, + "rounds": 8, + "median": 0.1347099775011884, + "iqr": 0.009163152501059812, + "q1": 0.13076628749877273, + "q3": 0.13992943999983254, + "iqr_outliers": 0, + "stddev_outliers": 3, + "outliers": "3;0", + "ld15iqr": 0.1268487230008759, + "hd15iqr": 0.14295829899856471, + "ops": 7.403168188794318, + "total": 1.080618431999028, + "data": [ + 0.14295829899856471, + 0.13436564999938128, + 0.13881217000016477, + 0.1410467099995003, + 0.13178797499858774, + 0.1297445999989577, + 0.13505430500299553, + 0.1268487230008759 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-0.75]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-0.75]", + "params": { + "zoom": 6, + "item_width": 0.75 + }, + "param": "6-0.75", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.07463744200140354, + "max": 0.08529722000093898, + "mean": 0.07939257461503775, + "stddev": 0.002691959172431208, + "rounds": 13, + "median": 0.0788595570011239, + "iqr": 0.0035290212490508566, + "q1": 0.07768084224881022, + "q3": 0.08120986349786108, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.07463744200140354, + "hd15iqr": 0.08529722000093898, + "ops": 12.595636365854672, + "total": 1.0321034699954907, + "data": [ + 0.07994239300023764, + 0.07783370899778674, + 0.0776900429991656, + 0.0788595570011239, + 0.07463744200140354, + 0.08125438799834228, + 0.0776532399977441, + 0.08181836599760572, + 0.08119502199770068, + 0.07718187399950693, + 0.08529722000093898, + 0.0806061100010993, + 0.07813410600283532 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-1]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-1]", + "params": { + "zoom": 6, + "item_width": 1 + }, + "param": "6-1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.05851480500132311, + "max": 0.06430774700129405, + "mean": 0.06168284427783672, + "stddev": 0.0016228951986026318, + "rounds": 18, + "median": 0.06135784850084747, + "iqr": 0.0027047200019296724, + "q1": 0.060831270999187836, + "q3": 0.06353599100111751, + "iqr_outliers": 0, + "stddev_outliers": 7, + "outliers": "7;0", + "ld15iqr": 0.05851480500132311, + "hd15iqr": 0.06430774700129405, + "ops": 16.211963175623378, + "total": 1.110291197001061, + "data": [ + 0.06118627600153559, + 0.06430774700129405, + 0.06387675199948717, + 0.06353599100111751, + 0.06052612900020904, + 0.060831270999187836, + 0.062220438001531875, + 0.05851480500132311, + 0.06128720299966517, + 0.06124683300004108, + 0.05954658799964818, + 0.06385656800193829, + 0.061428494002029765, + 0.06006544800038682, + 0.06371408899940434, + 0.06163390099754906, + 0.06156741099766805, + 0.06094525299704401 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-1.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-1.5]", + "params": { + "zoom": 6, + "item_width": 1.5 + }, + "param": "6-1.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.042510893999860855, + "max": 0.049666887000057613, + "mean": 0.04612569804472018, + "stddev": 0.0016540591589389979, + "rounds": 22, + "median": 0.04573744499793975, + "iqr": 0.0020493189986154903, + "q1": 0.04529991500021424, + "q3": 0.04734923399882973, + "iqr_outliers": 0, + "stddev_outliers": 8, + "outliers": "8;0", + "ld15iqr": 0.042510893999860855, + "hd15iqr": 0.049666887000057613, + "ops": 21.679888703916664, + "total": 1.014765356983844, + "data": [ + 0.04734923399882973, + 0.04429187900313991, + 0.042510893999860855, + 0.04473474900078145, + 0.04529991500021424, + 0.04554212900256971, + 0.04442604599898914, + 0.045679858998482814, + 0.047726801996759605, + 0.04783722299907822, + 0.04555756400077371, + 0.04424794700025814, + 0.048447506997035816, + 0.04612629199982621, + 0.04820410599859315, + 0.046539479997591116, + 0.04555162799806567, + 0.04567985799803864, + 0.046430245998635655, + 0.049666887000057613, + 0.04712008099886589, + 0.04579503099739668 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-2]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-2]", + "params": { + "zoom": 6, + "item_width": 2 + }, + "param": "6-2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.042301935001887614, + "max": 0.0495885320015077, + "mean": 0.044751182250062506, + "stddev": 0.0019226710688970588, + "rounds": 24, + "median": 0.04421233649918577, + "iqr": 0.0012057274998369394, + "q1": 0.04363173349884164, + "q3": 0.04483746099867858, + "iqr_outliers": 4, + "stddev_outliers": 6, + "outliers": "6;4", + "ld15iqr": 0.042301935001887614, + "hd15iqr": 0.04736823900020681, + "ops": 22.345778362058876, + "total": 1.0740283740015002, + "data": [ + 0.04329690899976413, + 0.04402592499900493, + 0.04481430699888733, + 0.0441862139996374, + 0.043782525001006434, + 0.044828555997810327, + 0.04367328999796882, + 0.044974595999519806, + 0.043363400000089314, + 0.04945198999848799, + 0.04400217899819836, + 0.04736823900020681, + 0.0480746960020042, + 0.0495885320015077, + 0.04359017699971446, + 0.04392381500292686, + 0.04484636599954683, + 0.0427697380000609, + 0.042301935001887614, + 0.044630275002418784, + 0.044303760998445796, + 0.04423845899873413, + 0.04352725300122984, + 0.04446523700244143 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-3]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-3]", + "params": { + "zoom": 6, + "item_width": 3 + }, + "param": "6-3", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.03260270100145135, + "max": 0.04594939700109535, + "mean": 0.03932017700019599, + "stddev": 0.0033886416698431653, + "rounds": 27, + "median": 0.039124662998801796, + "iqr": 0.0042791097512235865, + "q1": 0.037114231248779106, + "q3": 0.04139334100000269, + "iqr_outliers": 0, + "stddev_outliers": 8, + "outliers": "8;0", + "ld15iqr": 0.03260270100145135, + "hd15iqr": 0.04594939700109535, + "ops": 25.432235465140852, + "total": 1.0616447790052916, + "data": [ + 0.03918521699961275, + 0.039124662998801796, + 0.04085459300040384, + 0.03933006999795907, + 0.038238919998548226, + 0.04558013800124172, + 0.045501774999138433, + 0.0415183059994888, + 0.03773312100020121, + 0.04012320200126851, + 0.03787322599964682, + 0.04200154600039241, + 0.04346076600268134, + 0.04594939700109535, + 0.0377901150022808, + 0.042507349000516115, + 0.04101844600154436, + 0.040246685999591136, + 0.035464149001199985, + 0.037032602998806396, + 0.037015980000433046, + 0.03260270100145135, + 0.037359115998697234, + 0.034945289000461344, + 0.03660397899875534, + 0.03765594699871144, + 0.034927479002362816 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-4]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-4]", + "params": { + "zoom": 6, + "item_width": 4 + }, + "param": "6-4", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.036126680999586824, + "max": 0.04487012900062837, + "mean": 0.03896573932161118, + "stddev": 0.002392502885028669, + "rounds": 28, + "median": 0.03843424250044336, + "iqr": 0.0034972590001416393, + "q1": 0.037080099999002414, + "q3": 0.04057735899914405, + "iqr_outliers": 0, + "stddev_outliers": 8, + "outliers": "8;0", + "ld15iqr": 0.036126680999586824, + "hd15iqr": 0.04487012900062837, + "ops": 25.663570547098022, + "total": 1.091040701005113, + "data": [ + 0.04196949600009248, + 0.038218742000026396, + 0.03735437100112904, + 0.04305352200026391, + 0.04069430999879842, + 0.041581241002859315, + 0.03641519799930393, + 0.036954242998035625, + 0.04046040799948969, + 0.03879103300278075, + 0.03729975600072066, + 0.03675952399862581, + 0.04079879699929734, + 0.04363412499878905, + 0.039502240000729216, + 0.036126680999586824, + 0.03678683200269006, + 0.03678920699894661, + 0.038649743000860326, + 0.0372059569999692, + 0.04487012900062837, + 0.039962922000995604, + 0.037445797002874315, + 0.03743511100037722, + 0.036178923000989016, + 0.03801689899773919, + 0.03899881599863875, + 0.039086677999875974 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-5]", + "params": { + "zoom": 6, + "item_width": 5 + }, + "param": "6-5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.03487881000182824, + "max": 0.04174747499928344, + "mean": 0.037700271428808003, + "stddev": 0.002003219081389196, + "rounds": 28, + "median": 0.03710860299906926, + "iqr": 0.0032580150000285357, + "q1": 0.03605426000103762, + "q3": 0.039312275001066155, + "iqr_outliers": 0, + "stddev_outliers": 10, + "outliers": "10;0", + "ld15iqr": 0.03487881000182824, + "hd15iqr": 0.04174747499928344, + "ops": 26.52500796680916, + "total": 1.0556076000066241, + "data": [ + 0.036404519003554014, + 0.03566244100147742, + 0.04006503599885036, + 0.041011334000359057, + 0.037138285999390064, + 0.035888034999516094, + 0.03707891999874846, + 0.03828286599673447, + 0.035546086000977084, + 0.035413106001215056, + 0.036980372002290096, + 0.03811782800039509, + 0.03661348899913719, + 0.03766901900235098, + 0.03919829200094682, + 0.03589159600232961, + 0.03487881000182824, + 0.03893351800070377, + 0.03942625800118549, + 0.04164892799963127, + 0.04174747499928344, + 0.034936987998662516, + 0.036812959999224404, + 0.039606730999366846, + 0.03621692399974563, + 0.03673459600031492, + 0.03782693399989512, + 0.03987625299851061 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-6]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-6]", + "params": { + "zoom": 6, + "item_width": 6 + }, + "param": "6-6", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.030040474000998074, + "max": 0.04595891800272511, + "mean": 0.03633510730008614, + "stddev": 0.0043045462862126484, + "rounds": 30, + "median": 0.036877674001516425, + "iqr": 0.007704540999839082, + "q1": 0.032137285998032894, + "q3": 0.039841826997871976, + "iqr_outliers": 0, + "stddev_outliers": 10, + "outliers": "10;0", + "ld15iqr": 0.030040474000998074, + "hd15iqr": 0.04595891800272511, + "ops": 27.521592044331992, + "total": 1.0900532190025842, + "data": [ + 0.03704330600157846, + 0.04039037099937559, + 0.04017309099799604, + 0.03581323899925337, + 0.039841826997871976, + 0.04328981499929796, + 0.037152539000089746, + 0.041258303997892654, + 0.039796708999347175, + 0.037076551001518965, + 0.035965216000477085, + 0.04216067000015755, + 0.037044493001303636, + 0.03418779300045571, + 0.04595891800272511, + 0.040525724998587975, + 0.03705755299961311, + 0.03956755600302131, + 0.03671204200145439, + 0.03355851100059226, + 0.03365587200096343, + 0.03159586599940667, + 0.031034261999593582, + 0.03230351200181758, + 0.032137285998032894, + 0.030491656998492545, + 0.03206011000293074, + 0.030754054998396896, + 0.03140589599934174, + 0.030040474000998074 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-8]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-8]", + "params": { + "zoom": 6, + "item_width": 8 + }, + "param": "6-8", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.029466998999851057, + "max": 0.035118658997816965, + "mean": 0.0317732569141039, + "stddev": 0.0011116560823296769, + "rounds": 35, + "median": 0.03184639699975378, + "iqr": 0.0011015400014002807, + "q1": 0.03125985899987427, + "q3": 0.03236139900127455, + "iqr_outliers": 2, + "stddev_outliers": 9, + "outliers": "9;2", + "ld15iqr": 0.02967003300000215, + "hd15iqr": 0.035118658997816965, + "ops": 31.473008974289563, + "total": 1.1120639919936366, + "data": [ + 0.03141539699936402, + 0.03188201500233845, + 0.032318950001354096, + 0.03188201599914464, + 0.03234269700260484, + 0.03293398499954492, + 0.030158020999806467, + 0.032220401997619774, + 0.03297316599855549, + 0.03193544500027201, + 0.03320944299775874, + 0.029466998999851057, + 0.03263121700001648, + 0.03162436600177898, + 0.029878999997890787, + 0.03160299400042277, + 0.03261221899811062, + 0.035118658997816965, + 0.03143676900072023, + 0.031933069996739505, + 0.030959464998886688, + 0.030906036001397297, + 0.033446908000769326, + 0.030955902999266982, + 0.03253385599964531, + 0.03125273499972536, + 0.031281231000320986, + 0.03155075399990892, + 0.03188320400295197, + 0.031553127999359276, + 0.031422522999491775, + 0.03236763300083112, + 0.02967003300000215, + 0.03184639699975378, + 0.03085735599961481 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[6-10]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[6-10]", + "params": { + "zoom": 6, + "item_width": 10 + }, + "param": "6-10", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.026975998996931594, + "max": 0.04209300799993798, + "mean": 0.03214526745681984, + "stddev": 0.0029009541935060648, + "rounds": 35, + "median": 0.032535049998841714, + "iqr": 0.003922621500350942, + "q1": 0.029960930250126694, + "q3": 0.033883551750477636, + "iqr_outliers": 1, + "stddev_outliers": 8, + "outliers": "8;1", + "ld15iqr": 0.026975998996931594, + "hd15iqr": 0.04209300799993798, + "ops": 31.10877834017969, + "total": 1.1250843609886942, + "data": [ + 0.029685470999538666, + 0.03109126299750642, + 0.028255932997126365, + 0.026975998996931594, + 0.029716340999584645, + 0.02902888099924894, + 0.030137841000396293, + 0.030155651998938993, + 0.029178483000578126, + 0.03001792199938791, + 0.029941933000372956, + 0.029191544999775942, + 0.028652499000600073, + 0.030491664001601748, + 0.030851424002321437, + 0.03384704099880764, + 0.03787088199896971, + 0.032096925999212544, + 0.034644923001906136, + 0.032717895999667235, + 0.03391234399896348, + 0.03392421700118575, + 0.033438600999943446, + 0.0338957220010343, + 0.03235932600000524, + 0.03323913299755077, + 0.03395390199875692, + 0.034150997998949606, + 0.0335490249999566, + 0.033031350998498965, + 0.034173557000030996, + 0.04209300799993798, + 0.032535049998841714, + 0.03348016000018106, + 0.032797448002384044 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-0.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-0.5]", + "params": { + "zoom": 7, + "item_width": 0.5 + }, + "param": "7-0.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.05863600000157021, + "max": 0.06823670299854712, + "mean": 0.06251938735273571, + "stddev": 0.0022581559398568876, + "rounds": 17, + "median": 0.06236657000044943, + "iqr": 0.002586880998023844, + "q1": 0.06106378149979719, + "q3": 0.06365066249782103, + "iqr_outliers": 1, + "stddev_outliers": 4, + "outliers": "4;1", + "ld15iqr": 0.05863600000157021, + "hd15iqr": 0.06823670299854712, + "ops": 15.995038376783489, + "total": 1.062829584996507, + "data": [ + 0.06236657000044943, + 0.06587986099839327, + 0.0637236809998285, + 0.06111394300023676, + 0.06390177900175331, + 0.061628056999325054, + 0.06823670299854712, + 0.06362632299715187, + 0.062382007999985944, + 0.06094534600197221, + 0.06093109799985541, + 0.05984113399972557, + 0.0634387259997311, + 0.06276551399787422, + 0.06230958200103487, + 0.05863600000157021, + 0.06110325999907218 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-0.75]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-0.75]", + "params": { + "zoom": 7, + "item_width": 0.75 + }, + "param": "7-0.75", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.04354155399778392, + "max": 0.048738473997218534, + "mean": 0.045375971043066114, + "stddev": 0.0013899984103265528, + "rounds": 23, + "median": 0.04513969400068163, + "iqr": 0.0020098417462577345, + "q1": 0.04439405400171381, + "q3": 0.046403895747971546, + "iqr_outliers": 0, + "stddev_outliers": 8, + "outliers": "8;0", + "ld15iqr": 0.04354155399778392, + "hd15iqr": 0.048738473997218534, + "ops": 22.038095869086856, + "total": 1.0436473339905206, + "data": [ + 0.044486663999123266, + 0.04644456099777017, + 0.04354155399778392, + 0.046033746999455616, + 0.04451278499982436, + 0.04513969400068163, + 0.04362229300022591, + 0.048738473997218534, + 0.04672833400036325, + 0.04391912500068429, + 0.04572267000185093, + 0.04478943299909588, + 0.044901042001583846, + 0.044947346999833826, + 0.04373271399890655, + 0.04566924100072356, + 0.046489682001265464, + 0.04436318400257733, + 0.04370896799809998, + 0.04515987799823051, + 0.04768887899990659, + 0.04702516499673948, + 0.04628189999857568 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-1]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-1]", + "params": { + "zoom": 7, + "item_width": 1 + }, + "param": "7-1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.038548863001778955, + "max": 0.044610154000110924, + "mean": 0.04028780892568412, + "stddev": 0.0012854161512075718, + "rounds": 27, + "median": 0.04029422899839119, + "iqr": 0.0013024955014770967, + "q1": 0.039389784499689995, + "q3": 0.04069228000116709, + "iqr_outliers": 1, + "stddev_outliers": 6, + "outliers": "6;1", + "ld15iqr": 0.038548863001778955, + "hd15iqr": 0.044610154000110924, + "ops": 24.821404456236987, + "total": 1.0877708409934712, + "data": [ + 0.03955571199912811, + 0.04021467699931236, + 0.03939067399915075, + 0.0399344689976715, + 0.03902379099963582, + 0.0392315739991318, + 0.03859041900068405, + 0.04195054699812317, + 0.040376155000558356, + 0.042304368998884456, + 0.04080359200088424, + 0.039497534999100026, + 0.04029422899839119, + 0.03935624400037341, + 0.04052694500205689, + 0.039895288999105105, + 0.038548863001778955, + 0.04146493200096302, + 0.04038209099962842, + 0.03889556200010702, + 0.041216779998649145, + 0.0405756250002014, + 0.044610154000110924, + 0.04053881900108536, + 0.04073116500148899, + 0.03938948799986974, + 0.040471140997397015 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-1.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-1.5]", + "params": { + "zoom": 7, + "item_width": 1.5 + }, + "param": "7-1.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.03365115400083596, + "max": 0.038333962998876814, + "mean": 0.03571895903320789, + "stddev": 0.0011727307440549206, + "rounds": 30, + "median": 0.03574915599892847, + "iqr": 0.0013927309955761302, + "q1": 0.03493702700143331, + "q3": 0.03632975799700944, + "iqr_outliers": 0, + "stddev_outliers": 9, + "outliers": "9;0", + "ld15iqr": 0.03365115400083596, + "hd15iqr": 0.038333962998876814, + "ops": 27.996336597331986, + "total": 1.0715687709962367, + "data": [ + 0.03577052699984051, + 0.03538939600184676, + 0.03459745000145631, + 0.03440985300039756, + 0.03530628500084276, + 0.03578596399893286, + 0.03455233400018187, + 0.03680350099966745, + 0.03682012299759663, + 0.03631788499842514, + 0.03365115400083596, + 0.03578833799838321, + 0.034114211000996875, + 0.038068002002546564, + 0.03616472100111423, + 0.035592429998359876, + 0.03632975799700944, + 0.03572778499801643, + 0.03622289999839268, + 0.03500470399740152, + 0.03406196899959468, + 0.03412727199975052, + 0.03548913299891865, + 0.037474339002073975, + 0.03661590400224668, + 0.038333962998876814, + 0.03522910899846465, + 0.03493702700143331, + 0.035793087001366075, + 0.03708964700126671 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-2]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-2]", + "params": { + "zoom": 7, + "item_width": 2 + }, + "param": "7-2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.028906609000841854, + "max": 0.035358532000827836, + "mean": 0.0319112826878154, + "stddev": 0.0015387649107082991, + "rounds": 32, + "median": 0.03188560699891241, + "iqr": 0.0017311204992438434, + "q1": 0.0308466970018344, + "q3": 0.03257781750107824, + "iqr_outliers": 1, + "stddev_outliers": 9, + "outliers": "9;1", + "ld15iqr": 0.028906609000841854, + "hd15iqr": 0.035358532000827836, + "ops": 31.33687886453487, + "total": 1.0211610460100928, + "data": [ + 0.03288058399994043, + 0.0333008970010269, + 0.03068165800141287, + 0.0319900909998978, + 0.03119695799978217, + 0.028906609000841854, + 0.030351583001902327, + 0.03415102299913997, + 0.03243890100202407, + 0.0317550020008639, + 0.03226198900301824, + 0.029107267000654247, + 0.03183811399867409, + 0.03240684199772659, + 0.031771623998793075, + 0.030382453001948306, + 0.03186779699899489, + 0.031715819000964984, + 0.030463191997114336, + 0.031903416998829925, + 0.030586674001824576, + 0.03101173600225593, + 0.02950977000000421, + 0.03208745200026897, + 0.03271673400013242, + 0.03142492500046501, + 0.035358532000827836, + 0.0322239939996507, + 0.03410471700044582, + 0.03201383800114854, + 0.03500708399951691, + 0.03374377000000095 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-3]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-3]", + "params": { + "zoom": 7, + "item_width": 3 + }, + "param": "7-3", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.029087087001244072, + "max": 0.03676670400091098, + "mean": 0.03163497772766277, + "stddev": 0.0014185766524036627, + "rounds": 33, + "median": 0.03158284399978584, + "iqr": 0.0012312565004322096, + "q1": 0.030951482500313432, + "q3": 0.03218273900074564, + "iqr_outliers": 3, + "stddev_outliers": 7, + "outliers": "7;3", + "ld15iqr": 0.0291345799996634, + "hd15iqr": 0.03412371900049038, + "ops": 31.610580181492075, + "total": 1.0439542650128715, + "data": [ + 0.032865152999875136, + 0.031371498000225984, + 0.03136912400077563, + 0.032038774999819, + 0.030763588001718745, + 0.031986534002498956, + 0.029087087001244072, + 0.03213851100008469, + 0.03412371900049038, + 0.03289365000091493, + 0.030415704000915866, + 0.03158284399978584, + 0.031763317001605174, + 0.03144511400023475, + 0.03193191800164641, + 0.030003701001987793, + 0.029894466999394353, + 0.031568596001307014, + 0.0324092209993978, + 0.03182387099877815, + 0.03147717200045008, + 0.030071378998400178, + 0.030258975999458926, + 0.0291345799996634, + 0.03154959799940116, + 0.032324921998224454, + 0.03129788599835592, + 0.03676670400091098, + 0.03182624500186648, + 0.03243890500016278, + 0.03200196900070296, + 0.032315423002728494, + 0.031014113999844994 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-4]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-4]", + "params": { + "zoom": 7, + "item_width": 4 + }, + "param": "7-4", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.027581562000705162, + "max": 0.034331506001763046, + "mean": 0.03041731352973062, + "stddev": 0.001521611379613399, + "rounds": 34, + "median": 0.0303409059997648, + "iqr": 0.0015363989987235982, + "q1": 0.02964750799947069, + "q3": 0.03118390699819429, + "iqr_outliers": 1, + "stddev_outliers": 12, + "outliers": "12;1", + "ld15iqr": 0.027581562000705162, + "hd15iqr": 0.034331506001763046, + "ops": 32.87601316344311, + "total": 1.034188660010841, + "data": [ + 0.03198772500036284, + 0.0319449810012884, + 0.031002244002593216, + 0.030888261000654893, + 0.02975436599808745, + 0.030262541000411147, + 0.0298434169999382, + 0.03118390699819429, + 0.030980874002125347, + 0.03254339400155004, + 0.028778386000340106, + 0.028194221999001456, + 0.027581562000705162, + 0.02964750799947069, + 0.028952922999451403, + 0.029886160002206452, + 0.030547499998647254, + 0.03085501799796475, + 0.03128482899774099, + 0.029976397003338207, + 0.030267292000644375, + 0.03216226299991831, + 0.0294052940007532, + 0.031698018003226025, + 0.03062823800064507, + 0.027803591998235788, + 0.028349762000289047, + 0.0302103009998973, + 0.028399630002240883, + 0.034331506001763046, + 0.030406208999920636, + 0.033328215999063104, + 0.030275602999608964, + 0.030826521000562934 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-5]", + "params": { + "zoom": 7, + "item_width": 5 + }, + "param": "7-5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.029624953000165988, + "max": 0.03544047200193745, + "mean": 0.03163227453126183, + "stddev": 0.0013722909373689459, + "rounds": 32, + "median": 0.0315466385018226, + "iqr": 0.0019151540018356172, + "q1": 0.030518415498590912, + "q3": 0.03243356950042653, + "iqr_outliers": 1, + "stddev_outliers": 10, + "outliers": "10;1", + "ld15iqr": 0.029624953000165988, + "hd15iqr": 0.03544047200193745, + "ops": 31.613281523960946, + "total": 1.0122327850003785, + "data": [ + 0.03236292300061905, + 0.031078236999746878, + 0.032562393997068284, + 0.03205659299783292, + 0.03353956299906713, + 0.03250421600023401, + 0.030679297000460792, + 0.030446581997239264, + 0.030127191999781644, + 0.031597100001818035, + 0.03289603400116903, + 0.03085620999991079, + 0.030072575002122903, + 0.03132282899969141, + 0.02995740400001523, + 0.031661215998610714, + 0.031255150999641046, + 0.029624953000165988, + 0.034652089001610875, + 0.030336161002196604, + 0.03097850300036953, + 0.03012363000016194, + 0.0320767800003523, + 0.032229945001745364, + 0.03059024899994256, + 0.030080885997449514, + 0.03328547599812737, + 0.031496177001827164, + 0.03174314100033371, + 0.03544047200193745, + 0.032525588998396415, + 0.032073218000732595 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-6]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-6]", + "params": { + "zoom": 7, + "item_width": 6 + }, + "param": "7-6", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.028555175998917548, + "max": 0.03251253300186363, + "mean": 0.030253447555676556, + "stddev": 0.0010558645538548761, + "rounds": 36, + "median": 0.03013194450068113, + "iqr": 0.001688376998572494, + "q1": 0.029296067001268966, + "q3": 0.03098444399984146, + "iqr_outliers": 0, + "stddev_outliers": 14, + "outliers": "14;0", + "ld15iqr": 0.028555175998917548, + "hd15iqr": 0.03251253300186363, + "ops": 33.05408410594073, + "total": 1.089124112004356, + "data": [ + 0.030247113998484565, + 0.030636556999525055, + 0.029297254000994144, + 0.029294880001543788, + 0.02926163400115911, + 0.03138338500139071, + 0.029210578999482095, + 0.029475352002918953, + 0.030191310001100646, + 0.02983748699989519, + 0.030895395000698045, + 0.02914765300010913, + 0.030963072000304237, + 0.03199960799975088, + 0.02985529900252004, + 0.029063352001685416, + 0.03001083799972548, + 0.031768078999448335, + 0.030256614001700655, + 0.029065726997941965, + 0.032276254998578224, + 0.030529698997270316, + 0.030372971999895526, + 0.028945805999683216, + 0.02973894000024302, + 0.02881163900019601, + 0.03144750199862756, + 0.03156029700039653, + 0.028555175998917548, + 0.02942786100174999, + 0.030723233001481276, + 0.030072579000261612, + 0.03251253300186363, + 0.031005815999378683, + 0.029858859998057596, + 0.03142375499737682 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-8]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-8]", + "params": { + "zoom": 7, + "item_width": 8 + }, + "param": "7-8", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.028266658999200445, + "max": 0.03293759799998952, + "mean": 0.030398328735078823, + "stddev": 0.0010968732816062303, + "rounds": 34, + "median": 0.030405034001887543, + "iqr": 0.0014794090020586737, + "q1": 0.02978168599656783, + "q3": 0.031261094998626504, + "iqr_outliers": 0, + "stddev_outliers": 11, + "outliers": "11;0", + "ld15iqr": 0.028266658999200445, + "hd15iqr": 0.03293759799998952, + "ops": 32.89654535665403, + "total": 1.03354317699268, + "data": [ + 0.03293759799998952, + 0.031353705999208614, + 0.028828263999457704, + 0.028266658999200445, + 0.02978168599656783, + 0.030090391999692656, + 0.029738943001575535, + 0.02993010300269816, + 0.030371787997864885, + 0.03128009200008819, + 0.03140357500160462, + 0.030444216001342284, + 0.030405034001887543, + 0.031261094998626504, + 0.030045274997974047, + 0.03119460499874549, + 0.03161017000093125, + 0.03018062899718643, + 0.029716384997300338, + 0.02863117000015336, + 0.02990754400161677, + 0.030071395998675143, + 0.031597108998539625, + 0.030409783001232427, + 0.029296071999851847, + 0.030473897997580934, + 0.028559929996845312, + 0.030412158001126954, + 0.031017694000183837, + 0.030405034001887543, + 0.03155436499946518, + 0.028773649002687307, + 0.032555280999076786, + 0.031037879001814872 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[7-10]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[7-10]", + "params": { + "zoom": 7, + "item_width": 10 + }, + "param": "7-10", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.027302555998176103, + "max": 0.03296134999982314, + "mean": 0.029292249388870713, + "stddev": 0.0012300904623758812, + "rounds": 36, + "median": 0.02918980949834804, + "iqr": 0.0015280890020221705, + "q1": 0.02840973649836087, + "q3": 0.029937825500383042, + "iqr_outliers": 1, + "stddev_outliers": 12, + "outliers": "12;1", + "ld15iqr": 0.027302555998176103, + "hd15iqr": 0.03296134999982314, + "ops": 34.1387234119323, + "total": 1.0545209779993456, + "data": [ + 0.028638296000281116, + 0.02874396799961687, + 0.028501754000899382, + 0.031631544003175804, + 0.028944625999429263, + 0.031008198002382414, + 0.02980424899942591, + 0.027741865000280086, + 0.02796508199753589, + 0.02837114799694973, + 0.03085622000071453, + 0.027866535001521697, + 0.0292758909999975, + 0.029145284999685828, + 0.027721681999537395, + 0.030627068001194857, + 0.0274438470005407, + 0.028330780001851963, + 0.029078794999804813, + 0.029919422002421925, + 0.030410973999096313, + 0.027302555998176103, + 0.02914409799996065, + 0.030698307000420755, + 0.02995622899834416, + 0.029785253998852568, + 0.03296134999982314, + 0.028354526999464724, + 0.02957391000018106, + 0.02928301499923691, + 0.02968908000184456, + 0.02860624000095413, + 0.030064275000768248, + 0.028448324999772012, + 0.029392248998192372, + 0.029234333997010253 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-0.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-0.5]", + "params": { + "zoom": 8, + "item_width": 0.5 + }, + "param": "8-0.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.03788044600150897, + "max": 0.044045042002835544, + "mean": 0.04064544235996436, + "stddev": 0.0015116283612815955, + "rounds": 25, + "median": 0.04059704699830036, + "iqr": 0.0015732069959994988, + "q1": 0.039664106003328925, + "q3": 0.041237312999328424, + "iqr_outliers": 1, + "stddev_outliers": 9, + "outliers": "9;1", + "ld15iqr": 0.03788044600150897, + "hd15iqr": 0.044045042002835544, + "ops": 24.603004468343464, + "total": 1.016136058999109, + "data": [ + 0.04063860200039926, + 0.04158252599881962, + 0.043160482000530465, + 0.043389636997744674, + 0.04110878299979959, + 0.04084163500010618, + 0.04137711899966234, + 0.04247183400002541, + 0.04102685999896494, + 0.04059704699830036, + 0.044045042002835544, + 0.03788044600150897, + 0.03829600999961258, + 0.04054717999679269, + 0.0391271369990136, + 0.03996182800256065, + 0.03905946099985158, + 0.03968874300335301, + 0.039131886998802656, + 0.03985259399996721, + 0.04119071099921712, + 0.03959019500325667, + 0.041112347000307636, + 0.04018504600026063, + 0.0402729069974157 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-0.75]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-0.75]", + "params": { + "zoom": 8, + "item_width": 0.75 + }, + "param": "8-0.75", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.03196281700002146, + "max": 0.03790182000011555, + "mean": 0.03527197655182982, + "stddev": 0.0015415483599651623, + "rounds": 29, + "median": 0.03531463800027268, + "iqr": 0.002420364248791884, + "q1": 0.034211019249596575, + "q3": 0.03663138349838846, + "iqr_outliers": 0, + "stddev_outliers": 9, + "outliers": "9;0", + "ld15iqr": 0.03196281700002146, + "hd15iqr": 0.03790182000011555, + "ops": 28.35111886997789, + "total": 1.0228873200030648, + "data": [ + 0.037126497001736425, + 0.03454999899986433, + 0.03531463800027268, + 0.037422141002025455, + 0.03790182000011555, + 0.03617901100005838, + 0.03618732199902297, + 0.03487651400064351, + 0.036152890002995264, + 0.03387797300092643, + 0.03531463900071685, + 0.034897886998805916, + 0.0366040749977401, + 0.03727253900069627, + 0.03284500099834986, + 0.03511991800041869, + 0.032935237999481615, + 0.03481952400034061, + 0.03531463900071685, + 0.03671330900033354, + 0.03501543299717014, + 0.03671924599984777, + 0.03426266799942823, + 0.03196281700002146, + 0.03557703899787157, + 0.034056073000101605, + 0.032747640001616674, + 0.03402995199940051, + 0.03709087800234556 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-1]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-1]", + "params": { + "zoom": 8, + "item_width": 1 + }, + "param": "8-1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.0323878830022295, + "max": 0.03815472799760755, + "mean": 0.03524561979987387, + "stddev": 0.0011380670339047108, + "rounds": 30, + "median": 0.035330077498656465, + "iqr": 0.0012538160008261912, + "q1": 0.03457849999904283, + "q3": 0.035832315999869024, + "iqr_outliers": 2, + "stddev_outliers": 8, + "outliers": "8;2", + "ld15iqr": 0.03317626900025061, + "hd15iqr": 0.03815472799760755, + "ops": 28.3723198989844, + "total": 1.057368593996216, + "data": [ + 0.0357028979997267, + 0.035832315999869024, + 0.03457849999904283, + 0.03444195699921693, + 0.03695196500120801, + 0.0339563410016126, + 0.03526714899999206, + 0.0323878830022295, + 0.0353063309994468, + 0.03535382399786613, + 0.03384117100358708, + 0.03504155900009209, + 0.03548086899900227, + 0.03815472799760755, + 0.03578601199842524, + 0.035990231997857336, + 0.03428760700262501, + 0.03587743599928217, + 0.03542506499798037, + 0.03317626900025061, + 0.0349418229998264, + 0.03529920800065156, + 0.03653284000029089, + 0.03491807700265781, + 0.035834692000207724, + 0.036848668998572975, + 0.035555670998292044, + 0.03547374499976286, + 0.03494300999955158, + 0.034180746999481926 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-1.5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-1.5]", + "params": { + "zoom": 8, + "item_width": 1.5 + }, + "param": "8-1.5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.030248326002038084, + "max": 0.03439328300009947, + "mean": 0.0319867942187102, + "stddev": 0.0009411728636156087, + "rounds": 32, + "median": 0.031872588999249274, + "iqr": 0.0011837645033665467, + "q1": 0.03134007299922814, + "q3": 0.03252383750259469, + "iqr_outliers": 1, + "stddev_outliers": 8, + "outliers": "8;1", + "ld15iqr": 0.030248326002038084, + "hd15iqr": 0.03439328300009947, + "ops": 31.26290159502964, + "total": 1.0235774149987265, + "data": [ + 0.03385304800031008, + 0.03153063799982192, + 0.03127417500218144, + 0.032710840001527686, + 0.033669012002064846, + 0.031953325000358745, + 0.03182746899983613, + 0.03175504200044088, + 0.032221661997027695, + 0.031555571000353666, + 0.03299698599948897, + 0.032906748998357216, + 0.03243419400314451, + 0.031753855997521896, + 0.03130860899909749, + 0.03439328300009947, + 0.032091056997160194, + 0.032338019998860545, + 0.032613481002044864, + 0.03200913099863101, + 0.03187615099886898, + 0.030248326002038084, + 0.030944098998588743, + 0.032190791996981716, + 0.031371536999358796, + 0.031182752001768677, + 0.03144158999930369, + 0.0310485840018373, + 0.03284263400200871, + 0.030977344998973422, + 0.03186902699962957, + 0.030388430001039524 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-2]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-2]", + "params": { + "zoom": 8, + "item_width": 2 + }, + "param": "8-2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.028950582000106806, + "max": 0.03725355500137084, + "mean": 0.031806940118151356, + "stddev": 0.0014946978394731498, + "rounds": 34, + "median": 0.03164403200025845, + "iqr": 0.002005395999731263, + "q1": 0.030737507000594633, + "q3": 0.032742903000325896, + "iqr_outliers": 1, + "stddev_outliers": 9, + "outliers": "9;1", + "ld15iqr": 0.028950582000106806, + "hd15iqr": 0.03725355500137084, + "ops": 31.43967939969577, + "total": 1.081435964017146, + "data": [ + 0.032860447998245945, + 0.032930499997746665, + 0.030135533001157455, + 0.03163987600055407, + 0.0333591240014357, + 0.03725355500137084, + 0.030737507000594633, + 0.03192839600160369, + 0.03176691900080186, + 0.03258973600168247, + 0.033474293999461224, + 0.0323878910021449, + 0.032742903000325896, + 0.029632108002260793, + 0.03152945599867962, + 0.03024951699990197, + 0.03317627700016601, + 0.030543974000465823, + 0.030230520002078265, + 0.03336268700149958, + 0.03216823700131499, + 0.030519040999934077, + 0.03144515500025591, + 0.03164818799996283, + 0.0310153430000355, + 0.031651749999582535, + 0.03140834799705772, + 0.03270609600076568, + 0.03134542000043439, + 0.030598592002206715, + 0.028950582000106806, + 0.031205315000988776, + 0.03287232200091239, + 0.031370354001410306 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-3]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-3]", + "params": { + "zoom": 8, + "item_width": 3 + }, + "param": "8-3", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.029660606996912975, + "max": 0.033832871999038616, + "mean": 0.03176537699993898, + "stddev": 0.0010999915228235328, + "rounds": 33, + "median": 0.03196758299964131, + "iqr": 0.001908034250845958, + "q1": 0.03072385799987387, + "q3": 0.03263189225071983, + "iqr_outliers": 0, + "stddev_outliers": 11, + "outliers": "11;0", + "ld15iqr": 0.029660606996912975, + "hd15iqr": 0.033832871999038616, + "ops": 31.480816361849605, + "total": 1.0482574409979861, + "data": [ + 0.033832871999038616, + 0.030280389997642487, + 0.031687371996667935, + 0.032386707000114257, + 0.032153991000086535, + 0.03178948200002196, + 0.03289132200006861, + 0.030627090000052704, + 0.03196995599864749, + 0.0311685109991231, + 0.030679332001454895, + 0.03199370299989823, + 0.03062234100070782, + 0.031891594000626355, + 0.030738699999346863, + 0.03196758299964131, + 0.03349804699973902, + 0.030088045001321007, + 0.0327535930009617, + 0.032258478000585455, + 0.031011785002192482, + 0.03239620800013654, + 0.029660606996912975, + 0.030378939998627175, + 0.031088960997294635, + 0.030111790998489596, + 0.032640797002386535, + 0.03272509700036608, + 0.03262892400016426, + 0.032580244002019754, + 0.03271559900167631, + 0.033615592001297045, + 0.031423787000676384 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-4]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-4]", + "params": { + "zoom": 8, + "item_width": 4 + }, + "param": "8-4", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.027282394999929238, + "max": 0.03426506200048607, + "mean": 0.030401816441072323, + "stddev": 0.001716866245843405, + "rounds": 34, + "median": 0.030336792500747833, + "iqr": 0.0023212239975691773, + "q1": 0.028907845000503585, + "q3": 0.031229068998072762, + "iqr_outliers": 0, + "stddev_outliers": 12, + "outliers": "12;0", + "ld15iqr": 0.027282394999929238, + "hd15iqr": 0.03426506200048607, + "ops": 32.892771454570635, + "total": 1.033661758996459, + "data": [ + 0.030497674997604918, + 0.029383961998973973, + 0.029731849001109367, + 0.03278327899897704, + 0.03426506200048607, + 0.030776695999520598, + 0.03066746300100931, + 0.028907845000503585, + 0.028470907996961614, + 0.030291079998278292, + 0.031039095996675314, + 0.03215993199773948, + 0.029139373000361957, + 0.03053567000097246, + 0.03009160999863525, + 0.031229068998072762, + 0.0341736399968795, + 0.02858489299978828, + 0.030273272001068108, + 0.027876059000846, + 0.03098210600001039, + 0.028721434999170015, + 0.031764554001711076, + 0.028535025001474423, + 0.028791486998670734, + 0.03335200999936205, + 0.03073989100084873, + 0.030266147001384525, + 0.03132168100273702, + 0.03256718700140482, + 0.027282394999929238, + 0.028671567000856157, + 0.02940533600121853, + 0.030382505003217375 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-5]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-5]", + "params": { + "zoom": 8, + "item_width": 5 + }, + "param": "8-5", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.027861814000061713, + "max": 0.03240927499791724, + "mean": 0.030260070090937945, + "stddev": 0.0009621413396331114, + "rounds": 33, + "median": 0.030255463996581966, + "iqr": 0.001138348749918805, + "q1": 0.02963182200164738, + "q3": 0.030770170751566184, + "iqr_outliers": 1, + "stddev_outliers": 8, + "outliers": "8;1", + "ld15iqr": 0.02877605499816127, + "hd15iqr": 0.03240927499791724, + "ops": 33.0468500897317, + "total": 0.9985823130009521, + "data": [ + 0.030935801998566603, + 0.03057129299850203, + 0.029934886002592975, + 0.030205596001906088, + 0.029239111998322187, + 0.02877605499816127, + 0.03240927499791724, + 0.03159833000245271, + 0.029677236001589336, + 0.030676965001475764, + 0.030527361999702407, + 0.03076601500288234, + 0.02989332899960573, + 0.030255463996581966, + 0.031093718000192894, + 0.029296104999957606, + 0.031021291000797646, + 0.03225848599686287, + 0.03181442499771947, + 0.027861814000061713, + 0.02947420399868861, + 0.030294647000118857, + 0.029697422000026563, + 0.02994201100227656, + 0.029326976000447758, + 0.030294647000118857, + 0.030476308002107544, + 0.029499137999664526, + 0.030782637997617712, + 0.030115361001662677, + 0.029486077000910882, + 0.030704274999152403, + 0.02967605000230833 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-6]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-6]", + "params": { + "zoom": 8, + "item_width": 6 + }, + "param": "8-6", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.028949408999324078, + "max": 0.03259212699776981, + "mean": 0.030504839750089257, + "stddev": 0.0009478542205254766, + "rounds": 36, + "median": 0.03037479449994862, + "iqr": 0.001157642998805386, + "q1": 0.029859494999982417, + "q3": 0.031017137998787803, + "iqr_outliers": 0, + "stddev_outliers": 12, + "outliers": "12;0", + "ld15iqr": 0.028949408999324078, + "hd15iqr": 0.03259212699776981, + "ops": 32.78168343752974, + "total": 1.0981742310032132, + "data": [ + 0.030885938002029434, + 0.029247426999063464, + 0.03185717199812643, + 0.030361139000888215, + 0.029714046002482064, + 0.030447814999206457, + 0.028966030000447063, + 0.03104622699902393, + 0.0324805180025578, + 0.02979597200101125, + 0.03259212699776981, + 0.029552569998486433, + 0.031183956998575013, + 0.02986721200068132, + 0.030602167000324698, + 0.030076180999458302, + 0.02997763299936196, + 0.030777891999605345, + 0.029904020000685705, + 0.032488831002410734, + 0.03183461400112719, + 0.028949408999324078, + 0.029995444001542637, + 0.029851777999283513, + 0.030988048998551676, + 0.030612854003265966, + 0.031489102002524305, + 0.029530011997849215, + 0.03022103599869297, + 0.030209163000108674, + 0.03128962999835494, + 0.029380408999713836, + 0.030675781999889296, + 0.03028277700286708, + 0.030388449999009026, + 0.030650847998913378 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-8]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-8]", + "params": { + "zoom": 8, + "item_width": 8 + }, + "param": "8-8", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.027448631000879686, + "max": 0.03276548099893262, + "mean": 0.03027509761747805, + "stddev": 0.001078552563011638, + "rounds": 34, + "median": 0.030215102500733337, + "iqr": 0.0010638439998729154, + "q1": 0.029684368000744144, + "q3": 0.03074821200061706, + "iqr_outliers": 3, + "stddev_outliers": 9, + "outliers": "9;3", + "ld15iqr": 0.028456670999730704, + "hd15iqr": 0.0326989909990516, + "ops": 33.03044675973868, + "total": 1.0293533189942536, + "data": [ + 0.03276548099893262, + 0.03144517299733707, + 0.030481063997285673, + 0.031204144997900585, + 0.030190167999535333, + 0.029652309000084642, + 0.030148612000630237, + 0.030088057999819284, + 0.0326989909990516, + 0.03090375200190465, + 0.03074821200061706, + 0.031194647002848797, + 0.03150453899797867, + 0.03056773799835355, + 0.030211540000891546, + 0.02932579400294344, + 0.03017354699841235, + 0.03028159399764263, + 0.030238848998124013, + 0.03188804700039327, + 0.029565634999016766, + 0.03021866500057513, + 0.028456670999730704, + 0.03047037899887073, + 0.02943621700251242, + 0.0299527040006069, + 0.029684368000744144, + 0.030378953997569624, + 0.02917262999835657, + 0.03024241200182587, + 0.02867039000193472, + 0.027448631000879686, + 0.029856531000405084, + 0.03008687200053828 + ], + "iterations": 1 + } + }, + { + "group": "xyzsearch", + "name": "test1[8-10]", + "fullname": "src/pypgstac/tests/test_benchmark.py::test1[8-10]", + "params": { + "zoom": 8, + "item_width": 10 + }, + "param": "8-10", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 3, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": 2 + }, + "stats": { + "min": 0.027221853997616563, + "max": 0.032586199002253124, + "mean": 0.029672734942973227, + "stddev": 0.0012590932030563811, + "rounds": 35, + "median": 0.02938160299891024, + "iqr": 0.0017355754989694105, + "q1": 0.028647240749705816, + "q3": 0.030382816248675226, + "iqr_outliers": 0, + "stddev_outliers": 10, + "outliers": "10;0", + "ld15iqr": 0.027221853997616563, + "hd15iqr": 0.032586199002253124, + "ops": 33.700971680630644, + "total": 1.038545723004063, + "data": [ + 0.027221853997616563, + 0.030416951998631703, + 0.031562721997033805, + 0.030825392001133878, + 0.02917500699913944, + 0.029343607002374483, + 0.028673954999248963, + 0.0297544229979394, + 0.027784646998043172, + 0.028380685002048267, + 0.03194741600236739, + 0.03218013200239511, + 0.02952764300061972, + 0.031147157002124004, + 0.030203231999621494, + 0.029350731001613894, + 0.02928305300156353, + 0.028575405998708447, + 0.028595591000339482, + 0.029159572997741634, + 0.02995151999857626, + 0.0286383359998581, + 0.029634503000124823, + 0.030280408998805797, + 0.02938160299891024, + 0.03072565800175653, + 0.032586199002253124, + 0.0293721039997763, + 0.028415119002602296, + 0.03014505399914924, + 0.02973305200066534, + 0.028434116000426002, + 0.03099636800106964, + 0.028245330999197904, + 0.028897173000586918 + ], + "iterations": 1 + } + } + ], + "datetime": "2025-01-07T03:09:36.802381+00:00", + "version": "5.1.0" +} \ No newline at end of file diff --git a/docs/src/item_size_analysis.ipynb b/docs/src/item_size_analysis.ipynb new file mode 100644 index 00000000..8cbc30ff --- /dev/null +++ b/docs/src/item_size_analysis.ipynb @@ -0,0 +1,242 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f7b04830-7b6a-4e37-a2a3-9961970e06df", + "metadata": {}, + "source": [ + "# impacts of STAC item footprint size on dynamic tiling query performance\n", + "\n", + "**TL;DR:** If you have any control over the geographic footprint of the assets that you are cataloging with `pgstac` and you want to serve visualizations with a dynamic tiling application, try to maximize the size of the assets!\n", + "\n", + "Dynamic tiling applications like [`titiler-pgstac`](https://github.com/stac-utils/titiler-pgstac) send many queries to a `pgstac` database and clients are very sensitive to performance so it is worth considering a few basic ideas when building collections and items that may be used in this way.\n", + "\n", + "`pgstac`'s query functions perform relatively expensive spatial intersection operations so the fewer items there are in a collection x datetime partition, the faster the query will be. This is not a `pgstac`-specific problem (any application that needs to perform spatial intersections will take longer as the number of calculations increases), but it is worth demonstrating the influence of these factors in the dynamic tiling context." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d34feaea-5288-4124-bca1-6bd4090fd27d", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import math\n", + "import uuid\n", + "from datetime import datetime, timezone\n", + "from typing import Any, Dict, Generator, Tuple\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "from folium import Map, GeoJson, LayerControl\n", + "from matplotlib.colors import LogNorm\n", + "\n", + "\n", + "XMIN, YMIN = 0, 0\n", + "AOI_WIDTH = 50\n", + "AOI_HEIGHT = 50\n", + "ITEM_WIDTHS = [0.5, 1, 2, 4, 6, 8, 10]\n", + "\n", + "def generate_items(\n", + " item_size: Tuple[float, float],\n", + " collection_id: str,\n", + ") -> Generator[Dict[str, Any], None, None]:\n", + " item_width, item_height = item_size\n", + "\n", + " cols = math.ceil(AOI_WIDTH / item_width)\n", + " rows = math.ceil(AOI_HEIGHT / item_height)\n", + "\n", + " # Generate items for each grid cell\n", + " for row in range(rows):\n", + " for col in range(cols):\n", + " left = XMIN + (col * item_width)\n", + " bottom = YMIN + (row * item_height)\n", + " right = left + item_width\n", + " top = bottom + item_height\n", + "\n", + " yield {\n", + " \"type\": \"Feature\",\n", + " \"stac_version\": \"1.0.0\",\n", + " \"id\": str(uuid.uuid4()),\n", + " \"collection\": collection_id,\n", + " \"geometry\": {\n", + " \"type\": \"Polygon\",\n", + " \"coordinates\": [\n", + " [\n", + " [left, bottom],\n", + " [right, bottom],\n", + " [right, top],\n", + " [left, top],\n", + " [left, bottom],\n", + " ],\n", + " ],\n", + " },\n", + " \"bbox\": [left, bottom, right, top],\n", + " \"properties\": {\n", + " \"datetime\": datetime.now(timezone.utc).isoformat(),\n", + " },\n", + " }\n", + "\n", + "\n", + "\n", + "def load_benchmark_results() -> pd.DataFrame:\n", + " \"\"\"Load benchmark results from JSON file into a pandas DataFrame.\"\"\"\n", + " with open(\"./benchmark.json\") as f:\n", + " data = json.load(f)\n", + "\n", + " # Extract the benchmarks into a list of records\n", + " records = []\n", + " for benchmark in data[\"benchmarks\"]:\n", + " record = {\n", + " \"item_width\": benchmark[\"params\"][\"item_width\"],\n", + " \"zoom\": benchmark[\"params\"][\"zoom\"],\n", + " \"mean\": benchmark[\"stats\"][\"mean\"],\n", + " \"stddev\": benchmark[\"stats\"][\"stddev\"],\n", + " \"median\": benchmark[\"stats\"][\"median\"],\n", + " }\n", + "\n", + " records.append(record)\n", + "\n", + " return pd.DataFrame(records).sort_values(by=[\"item_width\", \"zoom\"])\n", + "\n", + "\n", + "stac_items = {\n", + " item_width: list(\n", + " generate_items(\n", + " (item_width, item_width),\n", + " f\"{item_width} degrees\"\n", + " )\n", + " )\n", + " for item_width in ITEM_WIDTHS\n", + "}\n", + "\n", + "df = load_benchmark_results()" + ] + }, + { + "cell_type": "markdown", + "id": "ceb365dc-67c1-4cbd-8b5e-7022a5773140", + "metadata": {}, + "source": [ + "## Scenario\n", + "Imagine you have a continental-scale dataset of gridded data that will be stored as cloud-optimized geotiffs (COGs) and you get to decide how the individual files will be spatially arranged and cataloged in a `pgstac` database. You could make items as small as 0.5 degree squares or as large as 10 degree squares. In this case the assets will be non-overlapping rectangular grids.\n", + "\n", + "The assets will be publicly accessible, so smaller file sizes might be useful for some applications/users, but since the data will be stored as COGs and we also want to be able to serve raster tile visualizations in a web map with `titiler-pgstac`, smaller file sizes are not very important. However, the processing pipleline that generates the assets might have some resource constraints that push you to choose a smaller tile size.\n", + "\n", + "Consider the following options for tile sizes:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ae1604f-df80-485b-a02a-4237f9ab0081", + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame(\n", + " {\"tile width (degrees)\": item_width, \"# items\": len(items)}\n", + " for item_width, items in stac_items.items()\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "fce001cb-ceb8-458e-9bda-e207d20362e7", + "metadata": {}, + "source": [ + "The number of items is inversely proportional to the square of the tile width which means that small changes in tile size can have a large impact on the eventual number of items in your catalog!\n", + "\n", + "This map shows the spatial arrangement of the items for a range of tile sizes:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4c19eafb-125e-46ad-8b6f-e0053084287f", + "metadata": {}, + "outputs": [], + "source": [ + "m = Map([25, 25], zoom_start=3)\n", + "for item_width in ITEM_WIDTHS:\n", + " layer_name = f\"{item_width} degrees\"\n", + " geojson = GeoJson(\n", + " {\n", + " \"type\": \"FeatureCollection\",\n", + " \"features\": stac_items[item_width],\n", + " },\n", + " name=layer_name,\n", + " overlay=True,\n", + " show=False,\n", + " )\n", + " geojson.add_to(m)\n", + " \n", + "LayerControl(collapsed=False, position=\"topright\").add_to(m)\n", + "\n", + "m" + ] + }, + { + "cell_type": "markdown", + "id": "1c9714e7-c865-4b73-8305-83851864e486", + "metadata": {}, + "source": [ + "## Performance comparison\n", + "To simulate the performance of queries made by a dynamic tiling application we have prepared a benchmarking procedure that uses the `pgstac` function `xyzsearch` to run an item query for an XYZ tile. By iterating over many combinations of tile sizes and zoom levels we can examine the response time with respect to item footprint size and tile zoom level. \n", + "\n", + "This figure shows average response time for `xyzsearch` to return a complete set of results for each zoom level for the range of item tile widths:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c61e8c44-df19-404d-8878-1efb5fddeb36", + "metadata": {}, + "outputs": [], + "source": [ + "ax = sns.heatmap(\n", + " df.pivot(index=\"item_width\", columns=\"zoom\", values=\"median\"),\n", + " norm=LogNorm(vmin=1e-2, vmax=1e1),\n", + " cbar_kws={\n", + " \"ticks\": np.logspace(-2, 0, num=3),\n", + " \"format\": \"%.1e\",\n", + " }\n", + ")\n", + "ax.set(xlabel=\"zoom level\", ylabel=\"item tile width\")\n", + "ax.xaxis.tick_top()\n", + "ax.xaxis.set_label_position(\"top\")\n", + "display(ax)" + ] + }, + { + "cell_type": "markdown", + "id": "cdb98e2e-e9da-4516-85f7-5576035b5915", + "metadata": {}, + "source": [ + "Without details about the resource configuration for a specific `pgstac` deployment it is hard to say which zoom level becomes inoperable for a given tile size, but queries that take >0.5 seconds in this test would probably yield poor results in a deployed context." + ] + } + ], + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/pypgstac/pyproject.toml b/src/pypgstac/pyproject.toml index 6fb97a13..3d84350f 100644 --- a/src/pypgstac/pyproject.toml +++ b/src/pypgstac/pyproject.toml @@ -35,9 +35,11 @@ dependencies = [ [project.optional-dependencies] test = [ "pytest", + "pytest-benchmark", "pytest-cov", "pystac[validation]==1.*", "types-cachetools", + "morecantile", ] dev = [ "flake8==7.1.1", @@ -55,6 +57,13 @@ migrations = [ "psycopg2-binary", "migra" ] +docs = [ + "jupyter", + "pandas", + "seaborn", + "mkdocs-jupyter", + "folium" +] [project.urls] @@ -123,3 +132,6 @@ namespace_packages = true [tool.pydocstyle] select = "D1" match = "(?!test).*.py" + +[tool.pytest.ini_options] +addopts = "-vv --benchmark-skip" diff --git a/src/pypgstac/tests/test_benchmark.py b/src/pypgstac/tests/test_benchmark.py new file mode 100644 index 00000000..d264898b --- /dev/null +++ b/src/pypgstac/tests/test_benchmark.py @@ -0,0 +1,150 @@ +import json +import uuid +from datetime import datetime, timezone +from math import ceil +from typing import Any, Dict, Generator, Tuple + +import morecantile +import psycopg +import pytest + +from pypgstac.load import Loader, Methods + +XMIN, YMIN = 0, 0 +AOI_WIDTH = 50 +AOI_HEIGHT = 50 + + +ITEM_WIDTHS = [0.5, 0.75, 1, 1.5, 2, 3, 4, 5, 6, 8, 10] +TMS = morecantile.tms.get("WebMercatorQuad") + + +def generate_items( + item_size: Tuple[float, float], + collection_id: str, +) -> Generator[Dict[str, Any], None, None]: + item_width, item_height = item_size + + cols = ceil(AOI_WIDTH / item_width) + rows = ceil(AOI_HEIGHT / item_height) + + # generate an item for each grid cell + for row in range(rows): + for col in range(cols): + left = XMIN + (col * item_width) + bottom = YMIN + (row * item_height) + right = left + item_width + top = bottom + item_height + + yield { + "type": "Feature", + "stac_version": "1.0.0", + "id": str(uuid.uuid4()), + "collection": collection_id, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [left, bottom], + [right, bottom], + [right, top], + [left, top], + [left, bottom], + ], + ], + }, + "bbox": [left, bottom, right, top], + "properties": { + "datetime": datetime.now(timezone.utc).isoformat(), + }, + } + + +@pytest.fixture(scope="function") +def search_hashes(loader: Loader) -> Dict[float, str]: + search_hashes = {} + for item_width in ITEM_WIDTHS: + collection_id = f"collection-{str(item_width)}" + collection = { + "type": "Collection", + "id": collection_id, + "stac_version": "1.0.0", + "description": f"Minimal test collection {collection_id}", + "license": "proprietary", + "extent": { + "spatial": { + "bbox": [XMIN, YMIN, XMIN + AOI_WIDTH, YMIN + AOI_HEIGHT], + }, + "temporal": { + "interval": [[datetime.now(timezone.utc).isoformat(), None]], + }, + }, + } + + loader.load_collections( + [collection], + insert_mode=Methods.insert, + ) + loader.load_items( + generate_items((item_width, item_width), collection_id), + insert_mode=Methods.insert, + ) + + with psycopg.connect(autocommit=True) as conn: + with conn.cursor() as cursor: + cursor.execute( + "SELECT * FROM search_query(%s);", + (json.dumps({"collections": [collection_id]}),), + ) + res = cursor.fetchone() + assert res + search_hashes[item_width] = res[0] + + return search_hashes + + +@pytest.mark.benchmark( + group="xyzsearch", + min_rounds=3, + warmup=True, + warmup_iterations=2, +) +@pytest.mark.parametrize("item_width", ITEM_WIDTHS) +@pytest.mark.parametrize("zoom", range(3, 8 + 1)) +def test1( + benchmark, + search_hashes: Dict[float, str], + item_width: float, + zoom: int, +) -> None: + # get a tile from the center of the full AOI + xmid = XMIN + AOI_WIDTH / 2 + ymid = YMIN + AOI_HEIGHT / 2 + tiles = TMS.tiles(xmid, ymid, xmid + 1, ymid + 1, [zoom]) + tile = next(tiles) + + def xyzsearch_test(): + with psycopg.connect(autocommit=True) as conn: + with conn.cursor() as cursor: + cursor.execute( + "SELECT * FROM xyzsearch(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s);", + ( + tile.x, + tile.y, + tile.z, + search_hashes[item_width], + json.dumps( + { + "include": ["assets", "id", "bbox", "collection"], + }, + ), # fields + 100000, # scan_limit, + 100000, # items limit + "5 seconds", + True, # exitwhenfull + True, # skipcovered + ), + ) + _ = cursor.fetchone()[0] + + _ = benchmark(xyzsearch_test)