Cython for All with GitHub Actions
Is Python an interpreted or compiled language? Trick question. It’s actually both. With tools like Cython, we can take the compilation step further and remove the interpreter loop almost entirely. Cython produces binaries much like C++, Go, and Rust do. Now with GitHub Actions the cross-platform build and release process can be automated for free for Open Source projects. This is an enormous opportunity to make the Python ecosystem 20-50% faster with a single pull request. This lightning talk walks through a GitHub workflow that publishes Cython-optimized wheels to PyPI. Discover how Cython can turbo-charge your Python code and GitHub Actions can simplify your cross-platform release process for free.
SF Python Holiday Party 2019
Is Python interpreted or compiled?
c2f.py
"Celsius to Fahrenheit Library"
def convert(celsius: float) -> float:
"Convert Celsius to Fahrenheit"
fahrenheit = celsius * 1.8 + 32
return fahrenheit
c2f.cpython-38.pyc
>>> import c2f
>>> dis.dis(c2f.convert)
6 0 LOAD_FAST 0 (celsius)
2 LOAD_CONST 1 (1.8)
4 BINARY_MULTIPLY
6 LOAD_CONST 2 (32)
8 BINARY_ADD
10 STORE_FAST 1 (fahrenheit)
7 12 LOAD_FAST 1 (fahrenheit)
14 RETURN_VALUE
setup.py
from setuptools import setup
from Cython.Build import cythonize
setup(
name='c2f',
version='0.0.0',
py_modules=['c2f'],
ext_modules=cythonize('c2f.py'),
)
c2f.c
$ cython c2f.py
static PyObject * __pyx_convert(double __pyx_v_celsius)
{
double __pyx_v_fahrenheit;
PyObject *__pyx_r = NULL;
__pyx_v_fahrenheit = ((__pyx_v_celsius * 1.8) + 32.0);
__pyx_r = PyFloat_FromDouble(__pyx_v_fahrenheit);
return __pyx_r;
}
c2f.so
$ python setup.py bdist_wheel
___pyx_convert:
push rbp
mov rbp, rsp
sub rsp, 16
movsd xmm0, qword ptr [rbp - 8]
mulsd xmm0, qword ptr [rip + 1379]
addsd xmm0, qword ptr [rip + 1379]
call 502 <PyFloat_FromDouble ...>
add rsp, 16
pop rbp
ret
.github/workflows/release.yml
name: release
on:
push:
tags:
- v*
jobs:
build-linux-cp38:
runs-on: ubuntu-latest
container: quay.io/pypa/manylinux2014_x86_64
steps:
...
Matrix Build
build-macos:
runs-on: macos-latest
strategy:
max-parallel: 4
matrix:
python-version: [3.5, 3.6, 3.7, 3.8]
steps:
...
Mac Build Steps
- name: Set up Python ${{ matrix.python-version }} x64
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
architecture: x64
- name: Install package dependencies
run: pip install cython wheel
- name: Build binary wheel
run: python setup.py bdist_wheel
Linux auditwheel Tool
- name: Build binary wheel
run: /opt/python/cp38-cp38/bin/python setup.py bdist_wheel
- name: Apply auditwheel for manylinux wheel
run: auditwheel repair -w dist dist/*
- name: Remove linux wheel
run: rm dist/*-linux_x86_64.whl
Windows Build Steps
- name: Download Build Tools for Visual Studio 2019
run: Invoke-WebRequest -Uri https://aka.ms/vs/16/rel...
- name: Run vs_buildtools.exe install
run: ./vs_buildtools.exe --quiet --wait --norestart ...
Store Build Artifacts
- name: Archive dist artifacts
uses: actions/upload-artifact@v1
with:
name: dist-macos-${{ matrix.python-version }}
path: dist
Source Distribution
upload:
needs: [build-linux-cp35, ...]
runs-on: ubuntu-latest
steps:
...
- name: Install dependencies
run: pip install -r requirements.txt
- name: Create source dist
run: python setup.py sdist
Stage Binary Wheels
- name: Stage linux 3.8
uses: actions/download-artifact@v1
with:
name: dist-linux-3.8
- run: mv -v dist-linux-3.8/* dist/
- name: Stage macos 3.8
uses: actions/download-artifact@v1
with:
name: dist-macos-3.8
- run: mv -v dist-macos-3.8/* dist/
...
Upload with Twine
- name: Upload with twine
env:
TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }}
TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }}
run: |
ls -l dist/*
pip install twine
twine upload dist/*
Cythonize all the Things!
PLEASE STEAL THE CODE!
Cythonize all the Things!
Cythonize all the Things!
Cythonize all the Things!
Cythonize all the Things!
Cythonize all the Things!
Cythonize all the Things!
Appendix
Dumping Assembly
$ gcc -g -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/Library/Frameworks/Python.framework/Versions/3.8/include/python3.8 -L/Library/Frameworks/Python.framework/Versions/3.8/lib -o c2f.so c2f.c -lpython3.8
$ objdump -S -df=___pyx_pw_3c2f_1convert c2f.so
Git Tagging
$ git tag -a v0.0.2 -m v0.0.2
$ git push
$ git push --tags
Release files for c2f 1.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| c2f-1.0.5.tar.gz | 28.5 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| c2f-1.0.5-cp38-cp38-win_amd64.whl | CPython 3.8 | CPython 3.8 | Windows x86-64 | Details |
| c2f-1.0.5-cp38-cp38-manylinux2014_x86_64.whl | CPython 3.8 | CPython 3.8 | Linux glibc 2.17+ x86-64 | Details |
| c2f-1.0.5-cp38-cp38-manylinux1_x86_64.whl | CPython 3.8 | CPython 3.8 | Linux glibc 2.5+ x86-64 | Details |
| c2f-1.0.5-cp38-cp38-macosx_10_13_x86_64.whl | CPython 3.8 | CPython 3.8 | macOS 10.13+ x86-64 | Details |
| c2f-1.0.5-cp37-cp37m-win_amd64.whl | CPython 3.7 | CPython 3.7 pymalloc | Windows x86-64 | Details |
| c2f-1.0.5-cp37-cp37m-manylinux2014_x86_64.whl | CPython 3.7 | CPython 3.7 pymalloc | Linux glibc 2.17+ x86-64 | Details |
| c2f-1.0.5-cp37-cp37m-manylinux1_x86_64.whl | CPython 3.7 | CPython 3.7 pymalloc | Linux glibc 2.5+ x86-64 | Details |
| c2f-1.0.5-cp37-cp37m-macosx_10_13_x86_64.whl | CPython 3.7 | CPython 3.7 pymalloc | macOS 10.13+ x86-64 | Details |
| c2f-1.0.5-cp36-cp36m-win_amd64.whl | CPython 3.6 | CPython 3.6 pymalloc | Windows x86-64 | Details |
| c2f-1.0.5-cp36-cp36m-manylinux2014_x86_64.whl | CPython 3.6 | CPython 3.6 pymalloc | Linux glibc 2.17+ x86-64 | Details |
| c2f-1.0.5-cp36-cp36m-manylinux1_x86_64.whl | CPython 3.6 | CPython 3.6 pymalloc | Linux glibc 2.5+ x86-64 | Details |
| c2f-1.0.5-cp36-cp36m-macosx_10_13_x86_64.whl | CPython 3.6 | CPython 3.6 pymalloc | macOS 10.13+ x86-64 | Details |
| c2f-1.0.5-cp35-cp35m-manylinux2014_x86_64.whl | CPython 3.5 | CPython 3.5 pymalloc | Linux glibc 2.17+ x86-64 | Details |
| c2f-1.0.5-cp35-cp35m-manylinux1_x86_64.whl | CPython 3.5 | CPython 3.5 pymalloc | Linux glibc 2.5+ x86-64 | Details |
| c2f-1.0.5-cp35-cp35m-macosx_10_13_x86_64.whl | CPython 3.5 | CPython 3.5 pymalloc | macOS 10.13+ x86-64 | Details |
Total release size: 508.5 kB
Release files / c2f-1.0.5.tar.gz
| Download URL | c2f-1.0.5.tar.gz |
|---|---|
| Size | 28.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
32a37e81f9011eda171b1e18efcff6f71a87642ce73f9cdae1e8ad885df2d24b
|
|
BLAKE2b-256 checksum How to use checksums |
38a40e62e09b7caeb357e7f0a752a560e64f59d0b0d00f1845020a2a3fb9a3a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp38-cp38-win_amd64.whl
| Download URL | c2f-1.0.5-cp38-cp38-win_amd64.whl |
|---|---|
| Size | 16.7 kB |
| Tags | CPython 3.8 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8b7d71c8995a1192f494a8e45a0a523eddd869290b1933ef53d681ba68331cc3
|
|
BLAKE2b-256 checksum How to use checksums |
8c1997cd9261f66a6fc4a8ea65c4ca4506c4f7097fec2422c7f8e82101f8ee50
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp38-cp38-manylinux2014_x86_64.whl
| Download URL | c2f-1.0.5-cp38-cp38-manylinux2014_x86_64.whl |
|---|---|
| Size | 49.3 kB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
b35ae1fb5879d1afbe5b2e7bfb714edd8fc083dc5a4b02e12212f791f6fb5775
|
|
BLAKE2b-256 checksum How to use checksums |
78c9501ed8f49eb7ab8a6d83fdd79bd963f98ce68e2aae67958b8af9efab321d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp38-cp38-manylinux1_x86_64.whl
| Download URL | c2f-1.0.5-cp38-cp38-manylinux1_x86_64.whl |
|---|---|
| Size | 49.3 kB |
| Tags | CPython 3.8 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
af22ee0b125a11e952a5b0c4beb38608c8a6bee47c3d8ec9fce278b317c4e543
|
|
BLAKE2b-256 checksum How to use checksums |
d5c6dee61af712f188f7893773e1ac37b2c256df9710dfc1c03174ed8da11913
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp38-cp38-macosx_10_13_x86_64.whl
| Download URL | c2f-1.0.5-cp38-cp38-macosx_10_13_x86_64.whl |
|---|---|
| Size | 13.8 kB |
| Tags | CPython 3.8 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
592d56360ec5fa7525c8874b2a8ba3e4d91e347152be296209378e4c7e5fe75e
|
|
BLAKE2b-256 checksum How to use checksums |
fdceb1338deadbaadac1dab0edf5b0e5c88cf497bf8d691eba7765cbf93713ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp37-cp37m-win_amd64.whl
| Download URL | c2f-1.0.5-cp37-cp37m-win_amd64.whl |
|---|---|
| Size | 16.6 kB |
| Tags | CPython 3.7 CPython 3.7 pymalloc Windows x86-64 |
|
SHA-256 checksum How to use checksums |
5f007efd3d1e01fb77c5413f19532d0d2b90051d51b73f4f87bb4927c73bafaa
|
|
BLAKE2b-256 checksum How to use checksums |
92bdfc05400a4b90ddb555bd0c0cf29795d533e8be0e9ae3edad2929beee85b2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp37-cp37m-manylinux2014_x86_64.whl
| Download URL | c2f-1.0.5-cp37-cp37m-manylinux2014_x86_64.whl |
|---|---|
| Size | 47.1 kB |
| Tags | CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
62fc80307d7058f1ab197cfcc0414bcaae64674e9ef86909c24900e4646e4948
|
|
BLAKE2b-256 checksum How to use checksums |
d31f042cca0538e4ec7d174bbf3b3f7a3cc7681d1c8ba03b3cd9b11426c9f98b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp37-cp37m-manylinux1_x86_64.whl
| Download URL | c2f-1.0.5-cp37-cp37m-manylinux1_x86_64.whl |
|---|---|
| Size | 47.1 kB |
| Tags | CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
e55252cc0da11995c3ec1ed9893d49f89d21a420c5c312503d9a0b03002e4b99
|
|
BLAKE2b-256 checksum How to use checksums |
3c98b241e9c4e10dea2e7c552a25eebc8b83fb2b20a4607d7c3aa7869bf1f119
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp37-cp37m-macosx_10_13_x86_64.whl
| Download URL | c2f-1.0.5-cp37-cp37m-macosx_10_13_x86_64.whl |
|---|---|
| Size | 13.7 kB |
| Tags | CPython 3.7 CPython 3.7 pymalloc macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
cefd1ece181fda3dab69758f4dc479fe00c9cbb66ed0c31531b03a77d4bc5615
|
|
BLAKE2b-256 checksum How to use checksums |
b6754edf497ecf0023e75f477c4875311a0ac321cc4b5ecb3f80988644e03f8d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp36-cp36m-win_amd64.whl
| Download URL | c2f-1.0.5-cp36-cp36m-win_amd64.whl |
|---|---|
| Size | 16.5 kB |
| Tags | CPython 3.6 CPython 3.6 pymalloc Windows x86-64 |
|
SHA-256 checksum How to use checksums |
921d4ec85ab00660d062169ad66907eb32f4e1ec97f3b123b87727effeb37194
|
|
BLAKE2b-256 checksum How to use checksums |
ec73e67420ed0dc962a2cf7f6db039ed7f1869a39b6474d0ba263bbd8e7c7350
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp36-cp36m-manylinux2014_x86_64.whl
| Download URL | c2f-1.0.5-cp36-cp36m-manylinux2014_x86_64.whl |
|---|---|
| Size | 46.1 kB |
| Tags | CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
2d0828f6ec2325b262df735d24fe759d4468506f4afad2695cd9ca82065cab90
|
|
BLAKE2b-256 checksum How to use checksums |
703f4a949a5ffb058039fc5c32a175ad26c8e088f5dbd04978e961eb7f5145ae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp36-cp36m-manylinux1_x86_64.whl
| Download URL | c2f-1.0.5-cp36-cp36m-manylinux1_x86_64.whl |
|---|---|
| Size | 46.1 kB |
| Tags | CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
e8107bd90fd33d505bc116f0499431969e55b7fc489bb45d2514a4931605d2c8
|
|
BLAKE2b-256 checksum How to use checksums |
b31074d162ca7b7f65e714e957a35ee1f9b0fd293fbcd87989e31e3a23103679
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp36-cp36m-macosx_10_13_x86_64.whl
| Download URL | c2f-1.0.5-cp36-cp36m-macosx_10_13_x86_64.whl |
|---|---|
| Size | 13.6 kB |
| Tags | CPython 3.6 CPython 3.6 pymalloc macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
7177a2034f173efda0cad6a34353f61cb70e2a81124f60942405c0e811210d62
|
|
BLAKE2b-256 checksum How to use checksums |
6e3817f6846d92af4e00f2a38f0e03fabeb1305c6c6dd579671e0df9f4f6dd18
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp35-cp35m-manylinux2014_x86_64.whl
| Download URL | c2f-1.0.5-cp35-cp35m-manylinux2014_x86_64.whl |
|---|---|
| Size | 45.4 kB |
| Tags | CPython 3.5 CPython 3.5 pymalloc Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
55d1687e7f585f09273ad3204f6d48c36b590b1232226b22575820e4e6fbf0f8
|
|
BLAKE2b-256 checksum How to use checksums |
e3586efd27bd8d6df65702c91637478d41f3fbec703da974baa6aa1c0a8d15ac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp35-cp35m-manylinux1_x86_64.whl
| Download URL | c2f-1.0.5-cp35-cp35m-manylinux1_x86_64.whl |
|---|---|
| Size | 45.4 kB |
| Tags | CPython 3.5 CPython 3.5 pymalloc Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
c40c5947b8a9ae50e16191cc8281ffadfec52d901289d79fd5ec42f025b67f17
|
|
BLAKE2b-256 checksum How to use checksums |
0d608e3f24bb3d34ace4843a27d4dde16212e6bf89e2e9b0cdad7388823a5fcd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|
Release files / c2f-1.0.5-cp35-cp35m-macosx_10_13_x86_64.whl
| Download URL | c2f-1.0.5-cp35-cp35m-macosx_10_13_x86_64.whl |
|---|---|
| Size | 13.5 kB |
| Tags | CPython 3.5 CPython 3.5 pymalloc macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
219cd3324f836703df7bb3ca89d4ea2e5b29584c03474905b34804b930de14fe
|
|
BLAKE2b-256 checksum How to use checksums |
5db17ab342c928dc157b521bd73459aeb3ee8e698e28a30afaf6a4ff39c372bb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.8.0
|