Skip to content

Commit 36659dc

Browse files
jan-janssenclaude
andauthored
Improve repository discoverability for scientist users (#993)
* Add design spec for improving repository discoverability Captures the approved plan to attract scientist end users by closing the discovery gap: README positioning section, a search-optimized comparison docs page, keyword/topic tuning, a social-preview card, and an awesome-list checklist. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Add implementation plan for discoverability improvements Task-by-task plan covering README positioning, comparison docs page, keyword/topic tuning, social-preview card, and maintainer checklist. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs: add Why executorlib positioning section to README * docs: add comparison page positioning executorlib vs alternatives * build: broaden PyPI keywords for discoverability * docs: add branded social-preview card for repository * docs: add maintainer checklist for GitHub-UI discoverability steps * Delete docs/superpowers/plans/2026-05-29-discoverability.md * Delete docs/superpowers/specs/2026-05-29-discoverability-design.md * Delete docs/superpowers/discoverability-manual-steps.md * Delete docs/images/social-preview.svg * Delete docs/images/social-preview.png * Revise comparison document title and introduction Updated title and introductory text for clarity. * fixes --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 35f2260 commit 36659dc

4 files changed

Lines changed: 105 additions & 1 deletion

File tree

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,26 @@ Up-scale python functions for high performance computing (HPC) with executorlib.
1919
machine learning pipelines and simulation workflows executorlib provides optional caching of intermediate results for
2020
iterative development in interactive environments like jupyter notebooks.
2121

22+
## Why executorlib?
23+
executorlib is the lightest path to take *existing* Python functions and scale them across high performance computing
24+
(HPC) nodes — with per-function-call resource control and native [SLURM](https://slurm.schedmd.com) and
25+
[flux](http://flux-framework.org) integration — without rewriting your code into a new paradigm. It extends the standard
26+
library [Executor interface](https://docs.python.org/3/library/concurrent.futures.html#executor-objects) you already
27+
know, rather than asking you to adopt a new data, actor, or workflow model.
28+
29+
| | executorlib | `concurrent.futures` | [Dask](https://www.dask.org) | [Parsl](https://parsl-project.org) | [Ray](https://www.ray.io) | [Snakemake](https://snakemake.github.io) |
30+
|---|---|---|---|---|---|---|
31+
| Drop-in `Executor` API ||| ⚠️ ||||
32+
| Per-call resource assignment ||| ⚠️ ||||
33+
| Native HPC scheduler (SLURM/flux) ||| ⚠️ || ⚠️ ||
34+
| MPI-parallel functions ||| ⚠️ || ⚠️ | ⚠️ |
35+
| Caching of results ||| ⚠️ ||||
36+
| Setup / learning overhead | Low | Very low | Medium | Medium | Medium | High |
37+
38+
✅ first-class · ⚠️ possible via add-on/config · ❌ not supported. See the full
39+
[comparison: when to use which](https://executorlib.readthedocs.io/en/latest/comparison.html) for honest guidance on
40+
when another tool is the better fit.
41+
2242
## Examples
2343
The Python standard library provides the [Executor interface](https://docs.python.org/3/library/concurrent.futures.html#executor-objects)
2444
with the [ProcessPoolExecutor](https://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor) and the
@@ -130,6 +150,14 @@ as hierarchical job scheduler within the allocations.
130150
* [HPC Job Executor](https://executorlib.readthedocs.io/en/latest/installation.html#hpc-job-executor)
131151
* [Visualisation](https://executorlib.readthedocs.io/en/latest/installation.html#visualisation)
132152
* [For Developers](https://executorlib.readthedocs.io/en/latest/installation.html#for-developers)
153+
* [Comparison](https://executorlib.readthedocs.io/en/latest/comparison.html#comparison)
154+
* [At a glace](https://executorlib.readthedocs.io/en/latest/comparison.html#at-a-glance)
155+
* [Concurrent futures](https://executorlib.readthedocs.io/en/latest/comparison.html#concurrent-futures-the-python-standard-library)
156+
* [Dask](https://executorlib.readthedocs.io/en/latest/comparison.html#dask)
157+
* [Parsl](https://executorlib.readthedocs.io/en/latest/comparison.html#parsl)
158+
* [Ray](https://executorlib.readthedocs.io/en/latest/comparison.html#ray)
159+
* [Snakemake](https://executorlib.readthedocs.io/en/latest/comparison.html#snakemake)
160+
* [Choose executorlib when](https://executorlib.readthedocs.io/en/latest/comparison.html#choose-executorlib-when)
133161
* [Single Node Executor](https://executorlib.readthedocs.io/en/latest/1-single-node.html)
134162
* [Basic Functionality](https://executorlib.readthedocs.io/en/latest/1-single-node.html#basic-functionality)
135163
* [Parallel Functions](https://executorlib.readthedocs.io/en/latest/1-single-node.html#parallel-functions)

docs/_toc.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ format: jb-book
22
root: README
33
chapters:
44
- file: installation.md
5+
- file: comparison.md
56
- file: 1-single-node.ipynb
67
- file: 2-hpc-cluster.ipynb
78
- file: 3-hpc-job.ipynb

docs/comparison.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Comparison
2+
3+
executorlib is the lightest path to take *existing* Python functions and scale them across high performance computing
4+
(HPC) nodes — with per-function-call resource control and native [SLURM](https://slurm.schedmd.com) and
5+
[flux](http://flux-framework.org) integration — without rewriting your code into a new paradigm. It extends the standard
6+
library [Executor interface](https://docs.python.org/3/library/concurrent.futures.html#executor-objects) you already
7+
know, rather than asking you to adopt a new data, actor, or workflow model.
8+
9+
This page compares executorlib with the tools scientists most often weigh it against, and is honest about when each
10+
alternative is the better choice.
11+
12+
## At a glance
13+
14+
| | executorlib | `concurrent.futures` | Dask | Parsl | Ray | Snakemake |
15+
|---|---|---|---|---|---|---|
16+
| Drop-in `Executor` API ||| ⚠️ ||||
17+
| Per-call resource assignment ||| ⚠️ ||||
18+
| Native HPC scheduler (SLURM/flux) ||| ⚠️ || ⚠️ ||
19+
| MPI-parallel functions ||| ⚠️ || ⚠️ | ⚠️ |
20+
| Caching of results ||| ⚠️ ||||
21+
| Setup / learning overhead | Low | Very low | Medium | Medium | Medium | High |
22+
23+
✅ first-class · ⚠️ possible via an add-on or extra configuration · ❌ not supported.
24+
25+
## [Concurrent futures](https://docs.python.org/3/library/concurrent.futures.html)
26+
27+
The [`concurrent.futures`](https://docs.python.org/3/library/concurrent.futures.html) module is where most parallel
28+
Python starts: `ProcessPoolExecutor` and `ThreadPoolExecutor` run functions in parallel on a single machine. executorlib
29+
deliberately mirrors this `Executor` interface so the step up to HPC is minimal.
30+
31+
**Use `concurrent.futures` instead when** your work fits comfortably on one machine and you do not need HPC schedulers,
32+
per-call resource control, MPI, or caching.
33+
34+
## [Dask](https://www.dask.org)
35+
36+
Dask scales NumPy/pandas-style workloads with parallel arrays, dataframes, and a `delayed`/futures API, and reaches HPC
37+
via [dask-jobqueue](https://jobqueue.dask.org). It is excellent for large out-of-core data structures, but its futures
38+
API is its own, and per-task resources and MPI rely on add-ons.
39+
40+
**Use Dask instead when** your problem is fundamentally about large arrays/dataframes or out-of-core data, rather than
41+
scheduling independent Python functions across an HPC allocation.
42+
43+
## [Parsl](https://parsl-project.org)
44+
45+
Parsl is the closest conceptual neighbor: a parallel scripting library with strong HPC support, MPI apps, and app-level
46+
caching. It uses its own decorator/app model (`@python_app`) and an executor-configuration layer rather than the standard
47+
library `Executor` interface.
48+
49+
**Use Parsl instead when** you are authoring a larger dataflow of apps and want its app/configuration model, or you need
50+
a provider it supports that executorlib does not.
51+
52+
## [Ray](https://www.ray.io)
53+
54+
Ray is a distributed framework built around remote tasks and stateful actors, widely used for AI/ML and reinforcement
55+
learning. It assigns CPUs/GPUs per task, but adopting Ray means adopting its `@ray.remote` programming model, and HPC
56+
scheduler integration is via cluster launchers rather than native SLURM/flux.
57+
58+
**Use Ray instead when** you need long-lived stateful actors, an AI/ML ecosystem, or a distributed-object model — and you
59+
are willing to write code in Ray's paradigm.
60+
61+
## [Snakemake](https://snakemake.github.io)
62+
63+
Snakemake is a file-oriented workflow manager: you declare rules with inputs/outputs and it builds a dependency graph,
64+
with strong HPC support and file-based caching. It is a workflow DSL, not a drop-in way to parallelize Python functions.
65+
66+
**Use Snakemake instead when** your pipeline is naturally expressed as files transformed by rules, and you want
67+
reproducible, file-driven workflow management rather than in-process Python futures.
68+
69+
## Choose executorlib when
70+
71+
- You already have Python functions and want to scale them across HPC nodes with minimal rewriting.
72+
- You want to assign cores, threads, or GPUs **per function call**.
73+
- You want native [SLURM](https://slurm.schedmd.com) / [flux](http://flux-framework.org) integration and optional MPI
74+
parallelism inside your functions.
75+
- You want optional caching of intermediate results for rapid, iterative prototyping in notebooks.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ authors = [
1515
]
1616
readme = "README.md"
1717
license = { file = "LICENSE" }
18-
keywords = ["high performance computing", "hpc", "task scheduler", "slurm", "flux-framework", "executor"]
18+
keywords = ["high performance computing", "hpc", "task scheduler", "slurm", "flux-framework", "executor", "python", "parallel computing", "distributed computing", "scientific computing", "concurrent.futures", "mpi4py", "gpu"]
1919
requires-python = ">3.9, <3.14"
2020
classifiers = [
2121
"Development Status :: 5 - Production/Stable",

0 commit comments

Comments
 (0)