goless Benchmarks
I benchmarked how goless performs under different backends (goless is a library that provides a Go-like concurrency model for Python, on top of stackless, PyPy, or gevent). Here are the results, also available on the goless readthedocs page:
Platform Backend Benchmark Time
======== ========= ============== =======
PyPy stackless chan_async 0.08400
CPython stackless chan_async 0.18000
PyPy gevent chan_async 0.46800
CPython gevent chan_async 1.32000
~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~
PyPy stackless chan_buff 0.08000
CPython stackless chan_buff 0.18000
PyPy gevent chan_buff 1.02000
CPython gevent chan_buff 1.26000
~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~
PyPy stackless chan_sync 0.04400
CPython stackless chan_sync 0.18000
PyPy gevent chan_sync 0.44800
CPython gevent chan_sync 1.26000
~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~
PyPy stackless select 0.06000
CPython stackless select 0.38000
PyPy gevent select 0.60400
CPython gevent select 1.94000
~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~
PyPy stackless select_default 0.00800
PyPy gevent select_default 0.01200
CPython stackless select_default 0.19000
CPython gevent select_default 0.25000
The trends are that PyPy with its built-in stackless support is fastest, then Stackless Python (2-5x), then PyPy with gevent (5-10x), and finally CPython with gevent (15-30x).
Remember that these are benchmarks of goless itself; goless performance characteristics may be different in real applications. For example, if you have lots of C extensions, CPython/stackless may pull ahead due to stack switching.
If you’re using goless for anything, I’d love to get some benchmarks, and find out how it’s working, so please comment below, or create a GitHub issue.
Disclaimers: It’s possible that goless is inefficiently using gevent, but the backend-specific code is so simple I doubt it (see goless/goless/backends.py). These benchmarks are all done against Python 2.7. Also I am no benchmark master (especially with PyPy) so there may be problems, look over goless/benchmark.py for benchmark code. These were done mostly for curiosity.