跳转到主要内容

Blosc数据压缩器

项目描述

一个为极快Blosc压缩库的Python封装

作者::

Blosc开发团队

联系::

blosc@blosc.org

Github::

https://github.com/Blosc/python-blosc

URL::

https://www.blosc.org/python-blosc/python-blosc.html

PyPi::

version

Anaconda::

anaconda

Gitter::

gitter

行为准则::

Contributor Covenant

是什么

Blosc (https://blosc.org) 是一种针对二进制数据的高性能压缩器。它被设计用来通过 memcpy() 操作系统调用,比传统的非压缩、直接内存读取方法更快地将数据传输到处理器缓存。

Blosc 在压缩包含相对低熵数据(如稀疏数据、时间序列、有规律间隔的网格等)的数值数组方面表现良好。

python-blosc 是一个 Python 包,它封装了 Blosc。python-blosc 支持 Python 3.9 或更高版本。

安装

Blosc 现在为主操作系统(Win、Mac 和 Linux)和平台提供 Python 轮子。您可以使用 pip 从 PyPi 安装二进制包。

$ pip install blosc

文档

基于 Sphinx 的文档在这里

https://blosc.org/python-blosc/python-blosc.html

此外,一些示例可在 python-blosc 维基页面上找到

https://github.com/blosc/python-blosc/wiki

最后,这里是有关于 EuroPython 2014 上“Compress me stupid”演讲的 录制幻灯片

构建

如果您需要更多控制,可以根据您是否想要链接到已安装的 Blosc 库来选择不同的方式编译 python-blosc。

通过 setuptools 安装

python-blosc 与 Blosc 源文件一起提供,可以使用以下命令构建:

$ python -m pip install -r requirements-dev.txt
$ python setup.py build_ext --inplace

可以通过适当的操作系统环境变量 INCLUDE_LZ4INCLUDE_SNAPPYINCLUDE_ZLIBINCLUDE_ZSTD 在此构建路径上启用(=1)或禁用(=0)任何编解码器。默认情况下,Blosc 中的所有编解码器都启用,除了 Snappy(由于与 gcc 工具链的一些问题)。

编译器特定的优化会自动通过检查构建 Blosc 的 CPU 标志来启用。可以通过设置以下环境变量手动禁用:DISABLE_BLOSC_SSE2DISABLE_BLOSC_AVX2

setuptools 限制使用环境变量 CC 中指定的编译器,在 POSIX 系统上通常是 gcc。这通常会导致 Snappy 编解码器出现问题,因为 Snappy 是用 C++ 编写的,因此默认情况下不再编译 Snappy。已知此问题不会影响 MSVC 或 clang。由于 Snappy 的压缩性能低于其他编解码器,因此 Snappy 在 Blosc 中被视为可选。

上述内容。现在您可以进行测试部分了。

使用已安装的 Blosc 库进行编译

此方法使用通过 CMake 构建的预构建、完全优化的 Blosc 版本。

请访问 https://github.com/Blosc/c-blosc/releases,下载并安装 C-Blosc 库。然后,您可以以几种方式告诉 python-blosc C-Blosc 库的位置:

使用环境变量

$ export USE_SYSTEM_BLOSC=1                 # or "set USE_SYSTEM_BLOSC=1" on Windows
$ export Blosc_ROOT=/usr/local/customprefix # If you installed Blosc into a custom location
$ python setup.py build_ext --inplace

使用标志

$ python setup.py build_ext --inplace -DUSE_SYSTEM_BLOSC:BOOL=YES -DBlosc_ROOT:PATH=/usr/local/customprefix

测试

编译后,您可以通过运行 blosc/test.py 中的 doctests 来快速检查包是否正常。

$ python -m blosc.test  (add -v for verbose mode)

安装后,您可以通过以下命令随时重新运行测试:

$ python -c "import blosc; blosc.test()"

基准测试

如果您好奇,您可能想运行一个小型基准测试,比较一个普通的 NumPy 数组复制与通过 Blosc 构建中的不同压缩器进行的压缩。

$ PYTHONPATH=. python bench/compress_ptr.py

为了激起您的兴趣,这里是在 Intel Xeon E5-2695 v3 @ 2.30GHz、运行 Python 3.5、CentOS 7 上的结果,但 YMMV(并且会变化!)

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
python-blosc version: 1.5.1.dev0
Blosc version: 1.11.2 ($Date:: 2017-01-27 #$)
Compressors available: ['blosclz', 'lz4', 'lz4hc', 'snappy', 'zlib', 'zstd']
Compressor library versions:
  BloscLZ: 1.0.5
  LZ4: 1.7.5
  Snappy: 1.1.1
  Zlib: 1.2.7
  Zstd: 1.1.2
Python version: 3.5.2 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:53:06)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
Platform: Linux-3.10.0-327.18.2.el7.x86_64-x86_64 (#1 SMP Thu May 12 11:03:55 UTC 2016)
Linux dist: CentOS Linux 7.2.1511
Processor: x86_64
Byte-ordering: little
Detected cores: 56
Number of threads to use by default: 4
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Creating NumPy arrays with 10**8 int64/float64 elements:
  *** ctypes.memmove() *** Time for memcpy(): 0.276 s (2.70 GB/s)

Times for compressing/decompressing with clevel=5 and 24 threads

*** the arange linear distribution ***
  *** blosclz , noshuffle  ***  0.382 s (1.95 GB/s) / 0.300 s (2.48 GB/s)     Compr. ratio:   1.0x
  *** blosclz , shuffle    ***  0.042 s (17.77 GB/s) / 0.027 s (27.18 GB/s)   Compr. ratio:  57.1x
  *** blosclz , bitshuffle ***  0.094 s (7.94 GB/s) / 0.041 s (18.28 GB/s)    Compr. ratio:  74.0x
  *** lz4     , noshuffle  ***  0.156 s (4.79 GB/s) / 0.052 s (14.30 GB/s)    Compr. ratio:   2.0x
  *** lz4     , shuffle    ***  0.033 s (22.58 GB/s) / 0.034 s (22.03 GB/s)   Compr. ratio:  68.6x
  *** lz4     , bitshuffle ***  0.059 s (12.63 GB/s) / 0.053 s (14.18 GB/s)   Compr. ratio:  33.1x
  *** lz4hc   , noshuffle  ***  0.443 s (1.68 GB/s) / 0.070 s (10.62 GB/s)    Compr. ratio:   2.0x
  *** lz4hc   , shuffle    ***  0.102 s (7.31 GB/s) / 0.029 s (25.42 GB/s)    Compr. ratio:  97.5x
  *** lz4hc   , bitshuffle ***  0.206 s (3.62 GB/s) / 0.038 s (19.85 GB/s)    Compr. ratio: 180.5x
  *** snappy  , noshuffle  ***  0.154 s (4.84 GB/s) / 0.056 s (13.28 GB/s)    Compr. ratio:   2.0x
  *** snappy  , shuffle    ***  0.044 s (16.89 GB/s) / 0.047 s (15.95 GB/s)   Compr. ratio:  17.4x
  *** snappy  , bitshuffle ***  0.064 s (11.58 GB/s) / 0.061 s (12.26 GB/s)   Compr. ratio:  18.2x
  *** zlib    , noshuffle  ***  1.172 s (0.64 GB/s) / 0.135 s (5.50 GB/s)     Compr. ratio:   5.3x
  *** zlib    , shuffle    ***  0.260 s (2.86 GB/s) / 0.086 s (8.67 GB/s)     Compr. ratio: 120.8x
  *** zlib    , bitshuffle ***  0.262 s (2.84 GB/s) / 0.094 s (7.96 GB/s)     Compr. ratio: 260.1x
  *** zstd    , noshuffle  ***  0.973 s (0.77 GB/s) / 0.093 s (8.00 GB/s)     Compr. ratio:   7.8x
  *** zstd    , shuffle    ***  0.093 s (7.97 GB/s) / 0.023 s (32.71 GB/s)    Compr. ratio: 156.7x
  *** zstd    , bitshuffle ***  0.115 s (6.46 GB/s) / 0.029 s (25.60 GB/s)    Compr. ratio: 320.6x

*** the linspace linear distribution ***
  *** blosclz , noshuffle  ***  0.341 s (2.19 GB/s) / 0.291 s (2.56 GB/s)     Compr. ratio:   1.0x
  *** blosclz , shuffle    ***  0.132 s (5.65 GB/s) / 0.023 s (33.10 GB/s)    Compr. ratio:   2.0x
  *** blosclz , bitshuffle ***  0.166 s (4.50 GB/s) / 0.036 s (20.89 GB/s)    Compr. ratio:   2.8x
  *** lz4     , noshuffle  ***  0.142 s (5.26 GB/s) / 0.028 s (27.07 GB/s)    Compr. ratio:   1.0x
  *** lz4     , shuffle    ***  0.093 s (8.01 GB/s) / 0.030 s (24.87 GB/s)    Compr. ratio:   3.4x
  *** lz4     , bitshuffle ***  0.102 s (7.31 GB/s) / 0.039 s (19.13 GB/s)    Compr. ratio:   5.3x
  *** lz4hc   , noshuffle  ***  0.700 s (1.06 GB/s) / 0.044 s (16.77 GB/s)    Compr. ratio:   1.1x
  *** lz4hc   , shuffle    ***  0.203 s (3.67 GB/s) / 0.021 s (36.22 GB/s)    Compr. ratio:   8.6x
  *** lz4hc   , bitshuffle ***  0.342 s (2.18 GB/s) / 0.028 s (26.50 GB/s)    Compr. ratio:  14.2x
  *** snappy  , noshuffle  ***  0.271 s (2.75 GB/s) / 0.274 s (2.72 GB/s)     Compr. ratio:   1.0x
  *** snappy  , shuffle    ***  0.099 s (7.54 GB/s) / 0.042 s (17.55 GB/s)    Compr. ratio:   4.2x
  *** snappy  , bitshuffle ***  0.127 s (5.86 GB/s) / 0.043 s (17.20 GB/s)    Compr. ratio:   6.1x
  *** zlib    , noshuffle  ***  1.525 s (0.49 GB/s) / 0.158 s (4.70 GB/s)     Compr. ratio:   1.6x
  *** zlib    , shuffle    ***  0.346 s (2.15 GB/s) / 0.098 s (7.59 GB/s)     Compr. ratio:  10.7x
  *** zlib    , bitshuffle ***  0.420 s (1.78 GB/s) / 0.104 s (7.20 GB/s)     Compr. ratio:  18.0x
  *** zstd    , noshuffle  ***  1.061 s (0.70 GB/s) / 0.096 s (7.79 GB/s)     Compr. ratio:   1.9x
  *** zstd    , shuffle    ***  0.203 s (3.68 GB/s) / 0.052 s (14.21 GB/s)    Compr. ratio:  14.2x
  *** zstd    , bitshuffle ***  0.251 s (2.97 GB/s) / 0.047 s (15.84 GB/s)    Compr. ratio:  22.2x

*** the random distribution ***
  *** blosclz , noshuffle  ***  0.340 s (2.19 GB/s) / 0.285 s (2.61 GB/s)     Compr. ratio:   1.0x
  *** blosclz , shuffle    ***  0.091 s (8.21 GB/s) / 0.017 s (44.29 GB/s)    Compr. ratio:   3.9x
  *** blosclz , bitshuffle ***  0.080 s (9.27 GB/s) / 0.029 s (26.12 GB/s)    Compr. ratio:   6.1x
  *** lz4     , noshuffle  ***  0.150 s (4.95 GB/s) / 0.027 s (28.05 GB/s)    Compr. ratio:   2.4x
  *** lz4     , shuffle    ***  0.068 s (11.02 GB/s) / 0.029 s (26.03 GB/s)   Compr. ratio:   4.5x
  *** lz4     , bitshuffle ***  0.063 s (11.87 GB/s) / 0.054 s (13.70 GB/s)   Compr. ratio:   6.2x
  *** lz4hc   , noshuffle  ***  0.645 s (1.15 GB/s) / 0.019 s (39.22 GB/s)    Compr. ratio:   3.5x
  *** lz4hc   , shuffle    ***  0.257 s (2.90 GB/s) / 0.022 s (34.62 GB/s)    Compr. ratio:   5.1x
  *** lz4hc   , bitshuffle ***  0.128 s (5.80 GB/s) / 0.029 s (25.52 GB/s)    Compr. ratio:   6.2x
  *** snappy  , noshuffle  ***  0.164 s (4.54 GB/s) / 0.048 s (15.46 GB/s)    Compr. ratio:   2.2x
  *** snappy  , shuffle    ***  0.082 s (9.09 GB/s) / 0.043 s (17.39 GB/s)    Compr. ratio:   4.3x
  *** snappy  , bitshuffle ***  0.071 s (10.48 GB/s) / 0.046 s (16.08 GB/s)   Compr. ratio:   5.0x
  *** zlib    , noshuffle  ***  1.223 s (0.61 GB/s) / 0.093 s (7.97 GB/s)     Compr. ratio:   4.0x
  *** zlib    , shuffle    ***  0.636 s (1.17 GB/s) / 0.126 s (5.89 GB/s)     Compr. ratio:   5.5x
  *** zlib    , bitshuffle ***  0.327 s (2.28 GB/s) / 0.109 s (6.81 GB/s)     Compr. ratio:   6.2x
  *** zstd    , noshuffle  ***  1.432 s (0.52 GB/s) / 0.103 s (7.27 GB/s)     Compr. ratio:   4.2x
  *** zstd    , shuffle    ***  0.388 s (1.92 GB/s) / 0.031 s (23.71 GB/s)    Compr. ratio:   5.9x
  *** zstd    , bitshuffle ***  0.127 s (5.86 GB/s) / 0.033 s (22.77 GB/s)    Compr. ratio:   6.4x

此外,Blosc 在 ARM 处理器上运行得相当好(甚至在没有 NEON 支持的情况下)

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
python-blosc version: 1.4.4
Blosc version: 1.11.2 ($Date:: 2017-01-27 #$)
Compressors available: ['blosclz', 'lz4', 'lz4hc', 'snappy', 'zlib', 'zstd']
Compressor library versions:
  BloscLZ: 1.0.5
  LZ4: 1.7.5
  Snappy: 1.1.1
  Zlib: 1.2.8
  Zstd: 1.1.2
Python version: 3.6.0 (default, Dec 31 2016, 21:20:16)
[GCC 4.9.2]
Platform: Linux-3.4.113-sun8i-armv7l (#50 SMP PREEMPT Mon Nov 14 08:41:55 CET 2016)
Linux dist: debian 9.0
Processor: not recognized
Byte-ordering: little
Detected cores: 4
Number of threads to use by default: 4
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  *** ctypes.memmove() *** Time for memcpy():   0.015 s (93.57 MB/s)

Times for compressing/decompressing with clevel=5 and 4 threads

*** user input ***
  *** blosclz , noshuffle  ***  0.015 s (89.93 MB/s) / 0.010 s (138.32 MB/s)    Compr. ratio:   2.7x
  *** blosclz , shuffle    ***  0.023 s (60.25 MB/s) / 0.012 s (112.71 MB/s)    Compr. ratio:   2.3x
  *** blosclz , bitshuffle ***  0.018 s (77.63 MB/s) / 0.021 s (66.76 MB/s)     Compr. ratio:   7.3x
  *** lz4     , noshuffle  ***  0.008 s (177.14 MB/s) / 0.009 s (159.00 MB/s)   Compr. ratio:   3.6x
  *** lz4     , shuffle    ***  0.010 s (131.29 MB/s) / 0.012 s (117.69 MB/s)   Compr. ratio:   3.5x
  *** lz4     , bitshuffle ***  0.015 s (89.97 MB/s) / 0.022 s (63.62 MB/s)     Compr. ratio:   8.4x
  *** lz4hc   , noshuffle  ***  0.071 s (19.30 MB/s) / 0.007 s (186.64 MB/s)    Compr. ratio:   8.6x
  *** lz4hc   , shuffle    ***  0.079 s (17.30 MB/s) / 0.014 s (95.99 MB/s)     Compr. ratio:   6.2x
  *** lz4hc   , bitshuffle ***  0.062 s (22.23 MB/s) / 0.027 s (51.53 MB/s)     Compr. ratio:   9.7x
  *** snappy  , noshuffle  ***  0.008 s (173.87 MB/s) / 0.009 s (148.77 MB/s)   Compr. ratio:   4.4x
  *** snappy  , shuffle    ***  0.011 s (123.22 MB/s) / 0.016 s (85.16 MB/s)    Compr. ratio:   4.4x
  *** snappy  , bitshuffle ***  0.015 s (89.02 MB/s) / 0.021 s (64.87 MB/s)     Compr. ratio:   6.2x
  *** zlib    , noshuffle  ***  0.047 s (29.26 MB/s) / 0.011 s (121.83 MB/s)    Compr. ratio:  14.7x
  *** zlib    , shuffle    ***  0.080 s (17.20 MB/s) / 0.022 s (63.61 MB/s)     Compr. ratio:   9.4x
  *** zlib    , bitshuffle ***  0.059 s (23.50 MB/s) / 0.033 s (41.10 MB/s)     Compr. ratio:  10.5x
  *** zstd    , noshuffle  ***  0.113 s (12.21 MB/s) / 0.011 s (124.64 MB/s)    Compr. ratio:  15.6x
  *** zstd    , shuffle    ***  0.154 s (8.92 MB/s) / 0.026 s (52.56 MB/s)      Compr. ratio:   9.9x
  *** zstd    , bitshuffle ***  0.116 s (11.86 MB/s) / 0.036 s (38.40 MB/s)     Compr. ratio:  11.4x

有关 ARM 基准测试的详细信息,请参阅: https://github.com/Blosc/python-blosc/issues/105

如果您发现您自己的结果很有趣,请将其反馈给作者!

许可

该软件受 3-Clause BSD 许可证的许可。python-blosc 许可证的副本可在 LICENSE.txt 中找到。

邮件列表

欢迎在 Blosc 列表中讨论此模块

blosc@googlegroups.com

https://groups.google.com/g/blosc


享受数据!

项目详情


下载文件

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

源代码分发

blosc-1.11.2.tar.gz (1.4 MB 查看哈希值)

上传时间 源代码

构建分发

blosc-1.11.2-cp312-cp312-win_amd64.whl (1.8 MB 查看哈希值)

上传时间 CPython 3.12 Windows x86-64

blosc-1.11.2-cp312-cp312-win32.whl (1.5 MB 查看哈希值)

上传时间 CPython 3.12 Windows x86

blosc-1.11.2-cp312-cp312-musllinux_1_2_x86_64.whl (2.7 MB 查看哈希值)

上传时间 CPython 3.12 musllinux: musl 1.2+ x86-64

blosc-1.11.2-cp312-cp312-musllinux_1_2_aarch64.whl (2.6 MB 查看哈希值)

上传时间 CPython 3.12 musllinux: musl 1.2+ ARM64

blosc-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ x86-64

blosc-1.11.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.5 MB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ ARM64

blosc-1.11.2-cp312-cp312-macosx_11_0_arm64.whl (1.8 MB 查看哈希值)

上传于 CPython 3.12 macOS 11.0+ ARM64

blosc-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.12 macOS 10.9+ x86-64

blosc-1.11.2-cp311-cp311-win_amd64.whl (1.8 MB 查看哈希值)

上传于 CPython 3.11 Windows x86-64

blosc-1.11.2-cp311-cp311-win32.whl (1.5 MB 查看哈希值)

上传于 CPython 3.11 Windows x86

blosc-1.11.2-cp311-cp311-musllinux_1_2_x86_64.whl (2.7 MB 查看哈希值)

上传于 CPython 3.11 musllinux: musl 1.2+ x86-64

blosc-1.11.2-cp311-cp311-musllinux_1_2_aarch64.whl (2.6 MB 查看哈希值)

上传于 CPython 3.11 musllinux: musl 1.2+ ARM64

blosc-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ x86-64

blosc-1.11.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.5 MB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ ARM64

blosc-1.11.2-cp311-cp311-macosx_11_0_arm64.whl (1.8 MB 查看哈希值)

上传于 CPython 3.11 macOS 11.0+ ARM64

blosc-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.11 macOS 10.9+ x86-64

blosc-1.11.2-cp310-cp310-win_amd64.whl (1.8 MB 查看哈希值)

上传于 CPython 3.10 Windows x86-64

blosc-1.11.2-cp310-cp310-win32.whl (1.5 MB 查看哈希值)

上传于 CPython 3.10 Windows x86

blosc-1.11.2-cp310-cp310-musllinux_1_2_x86_64.whl (2.7 MB 查看哈希值)

上传于 CPython 3.10 musllinux: musl 1.2+ x86-64

blosc-1.11.2-cp310-cp310-musllinux_1_2_aarch64.whl (2.6 MB 查看哈希值)

上传于 CPython 3.10 musllinux: musl 1.2+ ARM64

blosc-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ x86-64

blosc-1.11.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.5 MB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ ARM64

blosc-1.11.2-cp310-cp310-macosx_11_0_arm64.whl (1.8 MB 查看哈希值)

上传于 CPython 3.10 macOS 11.0+ ARM64

blosc-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.10 macOS 10.9+ x86-64

blosc-1.11.2-cp39-cp39-win_amd64.whl (1.8 MB 查看哈希值)

上传于 CPython 3.9 Windows x86-64

blosc-1.11.2-cp39-cp39-win32.whl (1.5 MB 查看哈希值)

上传于 CPython 3.9 Windows x86

blosc-1.11.2-cp39-cp39-musllinux_1_2_x86_64.whl (2.7 MB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.2+ x86-64

blosc-1.11.2-cp39-cp39-musllinux_1_2_aarch64.whl (2.6 MB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.2+ ARM64

blosc-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64

blosc-1.11.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.5 MB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ ARM64

blosc-1.11.2-cp39-cp39-macosx_11_0_arm64.whl (1.8 MB 查看哈希值)

上传于 CPython 3.9 macOS 11.0+ ARM64

blosc-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.9 macOS 10.9+ x86-64

由以下支持