跳转到主要内容

未提供项目描述

项目描述

Python是解释型还是编译型语言?这是一个陷阱问题。实际上,Python两者都是。通过像Cython这样的工具,我们可以将编译步骤更进一步,几乎完全去除解释器循环。Cython生成的二进制文件类似于C++、Go和Rust。现在,通过GitHub Actions,开源项目的跨平台构建和发布过程可以免费自动化。这是一个巨大的机会,通过单个拉取请求使Python生态系统快20-50%。这个闪电演讲将展示一个GitHub工作流程,该流程将Cython优化的轮子发布到PyPI。了解Cython如何为您的Python代码提速,GitHub Actions如何简化您的免费跨平台发布过程。

2019年SF Python假日派对

Python是解释型还是编译型?

.
.
.
?
.
.
.
?
.
.
.
?

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:
    ...

矩阵构建

build-macos:
  runs-on: macos-latest
  strategy:
    max-parallel: 4
    matrix:
      python-version: [3.5, 3.6, 3.7, 3.8]
  steps:
  ...

Mac构建步骤

- 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工具

- 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构建步骤

- 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 ...

存储构建工件

- name: Archive dist artifacts
  uses: actions/upload-artifact@v1
  with:
    name: dist-macos-${{ matrix.python-version }}
    path: dist

源分发

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

阶段二进制轮子

- 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/
...

使用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/*

将所有东西都Cython化!

请偷走这段代码!

将所有东西都Cython化!

将所有东西都Cython化!

将所有东西都Cython化!

将所有东西都Cython化!

将所有东西都Cython化!

将所有东西都Cython化!

附录

导出汇编

$ 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标签

$ git tag -a v0.0.2 -m v0.0.2
$ git push
$ git push --tags

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分发

c2f-1.0.5.tar.gz (28.5 kB 查看哈希值)

上传时间:

构建版本

c2f-1.0.5-cp38-cp38-win_amd64.whl (16.7 kB 查看哈希值)

上传于 CPython 3.8 Windows x86-64

c2f-1.0.5-cp38-cp38-manylinux2014_x86_64.whl (49.3 kB 查看哈希值)

上传于 CPython 3.8

c2f-1.0.5-cp38-cp38-manylinux1_x86_64.whl (49.3 kB 查看哈希值)

上传于 CPython 3.8

c2f-1.0.5-cp38-cp38-macosx_10_13_x86_64.whl (13.8 kB 查看哈希值)

上传于 CPython 3.8 macOS 10.13+ x86-64

c2f-1.0.5-cp37-cp37m-win_amd64.whl (16.6 kB 查看哈希值)

上传于 CPython 3.7m Windows x86-64

c2f-1.0.5-cp37-cp37m-manylinux2014_x86_64.whl (47.1 kB 查看哈希值)

上传于 CPython 3.7m

c2f-1.0.5-cp37-cp37m-manylinux1_x86_64.whl (47.1 kB 查看哈希值)

上传于 CPython 3.7m

c2f-1.0.5-cp37-cp37m-macosx_10_13_x86_64.whl (13.7 kB 查看哈希值)

上传于 CPython 3.7m macOS 10.13+ x86-64

c2f-1.0.5-cp37-cp37m-macosx_10_13_x86_64.whl (13.7 kB 查看哈希值)

上传于 CPython 3.6m Windows x86-64

c2f-1.0.5-cp36-cp36m-manylinux2014_x86_64.whl (46.1 kB 查看哈希值)

上传于 CPython 3.6m

c2f-1.0.5-cp36-cp36m-manylinux1_x86_64.whl (46.1 kB 查看哈希值)

上传于 CPython 3.6m

c2f-1.0.5-cp36-cp36m-macosx_10_13_x86_64.whl (13.6 kB 查看哈希值)

上传于 CPython 3.6m macOS 10.13+ x86-64

c2f-1.0.5-cp35-cp35m-manylinux2014_x86_64.whl (45.4 kB 查看哈希值)

上传于 CPython 3.5m

c2f-1.0.5-cp35-cp35m-manylinux1_x86_64.whl (45.4 kB 查看哈希值)

上传于 CPython 3.5m

c2f-1.0.5-cp35-cp35m-macosx_10_13_x86_64.whl (13.5 kB 查看哈希值)

上传于 CPython 3.5m macOS 10.13+ x86-64

支持