Summary
The isal 1.8.0 macOS arm64 wheel from PyPI appears to be built without any of ISA-L's optimized aarch64 assembly. Every hot function resolves to the plain-C _base implementation, and measured throughput is ~4–6x below the manylinux aarch64 wheel running on the same CPU (Apple M3, Linux container, no emulation).
Symbol evidence
macOS arm64 wheel (isal_zlib.cpython-312-darwin.so):
$ nm isal_zlib.cpython-312-darwin.so | grep -icE "neon|pmull"
0
$ nm isal_zlib.cpython-312-darwin.so | grep -E "crc32_gzip|deflate_body"
_crc32_gzip_refl
_crc32_gzip_refl_base
_isal_deflate_body
_isal_deflate_body_base
manylinux2014_aarch64 wheel, same version (isal-1.8.0-cp312-cp312-manylinux2014_aarch64...whl):
$ nm isal/isal_zlib.cpython-312-*.so | grep -iE "neon|pmull" | head
accum32_neon
adler32_neon
crc32_gzip_refl_pmull
crc32_ieee_norm_pmull
...
Measured impact (Apple M3, CPython 3.12, isal 1.8.0)
Gzip decompression of an 8 MiB realistic-entropy JSONL payload (37% compression ratio, compressed by stdlib zlib level 6):
| wheel |
decompress |
crc32 (8 MiB) |
| macOS arm64 (host) |
0.21 GB/s |
0.48 GB/s |
| manylinux aarch64 (container on same machine) |
2.40 GB/s |
(not measured) |
For comparison on the same host, stdlib zlib decompresses the same payload at 0.92 GB/s and zlib-ng at 0.63 GB/s — so the macOS wheel is also several times slower than every alternative it is meant to outperform.
Reproduce
import time, zlib
from isal import isal_zlib
data = open("/dev/urandom", "rb").read(4 * 1024 * 1024) + b"B" * (4 * 1024 * 1024)
c = zlib.compressobj(6, zlib.DEFLATED, 31)
payload = c.compress(data) + c.flush()
for name, mod in (("zlib", zlib), ("isal", isal_zlib)):
best = float("inf")
for _ in range(7):
d = mod.decompressobj(wbits=31)
t0 = time.perf_counter()
d.decompress(payload)
best = min(best, time.perf_counter() - t0)
print(name, f"{len(data)/best/1e9:.2f} GB/s")
Environment
- isal 1.8.0 (PyPI wheel), CPython 3.12.8
- macOS (Darwin 25.5.0), Apple M3
- Wheel filename:
isal-1.8.0-cp312-cp312-macosx_*_arm64.whl
Presumably the macOS build isn't assembling ISA-L's aarch64/*.S sources (they may need explicit handling with the Xcode toolchain), so the multibinary dispatchers only ever see the base functions. Related: #252 asks for arm64 to be listed as supported — worth noting that until this is fixed, the macOS arm64 wheel is likely slower than stdlib zlib for most workloads.
Summary
The
isal1.8.0 macOS arm64 wheel from PyPI appears to be built without any of ISA-L's optimized aarch64 assembly. Every hot function resolves to the plain-C_baseimplementation, and measured throughput is ~4–6x below the manylinux aarch64 wheel running on the same CPU (Apple M3, Linux container, no emulation).Symbol evidence
macOS arm64 wheel (
isal_zlib.cpython-312-darwin.so):manylinux2014_aarch64 wheel, same version (
isal-1.8.0-cp312-cp312-manylinux2014_aarch64...whl):Measured impact (Apple M3, CPython 3.12, isal 1.8.0)
Gzip decompression of an 8 MiB realistic-entropy JSONL payload (37% compression ratio, compressed by stdlib zlib level 6):
For comparison on the same host, stdlib
zlibdecompresses the same payload at 0.92 GB/s andzlib-ngat 0.63 GB/s — so the macOS wheel is also several times slower than every alternative it is meant to outperform.Reproduce
Environment
isal-1.8.0-cp312-cp312-macosx_*_arm64.whlPresumably the macOS build isn't assembling ISA-L's
aarch64/*.Ssources (they may need explicit handling with the Xcode toolchain), so the multibinary dispatchers only ever see the base functions. Related: #252 asks for arm64 to be listed as supported — worth noting that until this is fixed, the macOS arm64 wheel is likely slower than stdlib zlib for most workloads.