跳转到主要内容

不可变集合

项目描述

https://github.com/MagicStack/immutables/workflows/Tests/badge.svg?branch=master https://img.shields.io/pypi/v/immutables.svg

Python的一个不可变映射类型。

底层数据结构是哈希数组映射Trie(HAMT),在Clojure、Scala、Haskell和其他函数式语言中使用。此实现用于CPython 3.7的contextvars模块中(有关详细信息,请参阅PEP 550PEP 567)。

基于HAMT的不可变映射在set()get()操作中都具有O(log N)的性能,对于相对较小的映射来说,这实际上是O(1)。

以下是简单get/set基准测试的可视化,比较了HAMT与使用Python字典的写时复制方法实现的不可变映射(基准测试代码可在此处找到)

bench.png

安装

immutables需要Python 3.6+,并在PyPI上提供

$ pip install immutables

API

immutables.Map是一个无序不可变映射。Map对象是可哈希的、可比较的,并且可序列化。

Map对象实现了collections.abc.Mapping抽象基类,因此使用它与使用Python字典非常相似

import immutables

map = immutables.Map(a=1, b=2)

print(map['a'])
# will print '1'

print(map.get('z', 100))
# will print '100'

print('z' in map)
# will print 'False'

由于Map是不可变的,因此存在一个特殊的API用于突变,允许对Map对象应用更改并创建新的(派生)Map

map2 = map.set('a', 10)
print(map, map2)
# will print:
#   <immutables.Map({'a': 1, 'b': 2})>
#   <immutables.Map({'a': 10, 'b': 2})>

map3 = map2.delete('b')
print(map, map2, map3)
# will print:
#   <immutables.Map({'a': 1, 'b': 2})>
#   <immutables.Map({'a': 10, 'b': 2})>
#   <immutables.Map({'a': 10})>

Map还实现了批量更新的API:MapMutation对象

map_mutation = map.mutate()
map_mutation['a'] = 100
del map_mutation['b']
map_mutation.set('y', 'y')

map2 = map_mutation.finish()

print(map, map2)
# will print:
#   <immutables.Map({'a': 1, 'b': 2})>
#   <immutables.Map({'a': 100, 'y': 'y'})>

MapMutation对象是上下文管理器。以下是将上述示例重写为更自然方式的示例

with map.mutate() as mm:
    mm['a'] = 100
    del mm['b']
    mm.set('y', 'y')
    map2 = mm.finish()

print(map, map2)
# will print:
#   <immutables.Map({'a': 1, 'b': 2})>
#   <immutables.Map({'a': 100, 'y': 'y'})>

进一步开发

  • Python set类型的不可变版本,具有高效的add()discard()操作。

许可证

Apache 2.0

项目详情


下载文件

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

源分布

immutables-0.20.tar.gz (88.9 kB 查看哈希)

上传时间:

构建分布

immutables-0.20-cp312-cp312-win_amd64.whl (34.4 kB 查看哈希)

上传时间: CPython 3.12 Windows x86-64

immutables-0.20-cp312-cp312-win32.whl (30.7 kB 查看哈希)

上传时间: CPython 3.12 Windows x86

immutables-0.20-cp312-cp312-musllinux_1_1_x86_64.whl (102.2 kB 查看哈希值)

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

immutables-0.20-cp312-cp312-musllinux_1_1_aarch64.whl (102.3 kB 查看哈希值)

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

immutables-0.20-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (104.8 kB 查看哈希值)

上传时间: CPython 3.12 manylinux: glibc 2.17+ ARM64

immutables-0.20-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (105.4 kB 查看哈希值)

上传时间: CPython 3.12 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

immutables-0.20-cp312-cp312-macosx_11_0_arm64.whl (33.1 kB 查看哈希值)

上传时间: CPython 3.12 macOS 11.0+ ARM64

immutables-0.20-cp312-cp312-macosx_10_9_x86_64.whl (33.1 kB 查看哈希值)

上传时间: CPython 3.12 macOS 10.9+ x86-64

immutables-0.20-cp311-cp311-win_amd64.whl (33.7 kB 查看哈希值)

上传时间: CPython 3.11 Windows x86-64

immutables-0.20-cp311-cp311-win32.whl (30.3 kB 查看哈希值)

上传时间: CPython 3.11 Windows x86

immutables-0.20-cp311-cp311-musllinux_1_1_x86_64.whl (97.3 kB 查看哈希值)

上传时间: CPython 3.11 musllinux: musl 1.1+ x86-64

immutables-0.20-cp311-cp311-musllinux_1_1_aarch64.whl (98.0 kB 查看哈希值)

上传时间: CPython 3.11 musllinux: musl 1.1+ ARM64

immutables-0.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (99.4 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ ARM64

immutables-0.20-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (99.7 kB 查看哈希)

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

immutables-0.20-cp311-cp311-macosx_11_0_arm64.whl (32.7 kB 查看哈希)

上传于 CPython 3.11 macOS 11.0+ ARM64

immutables-0.20-cp311-cp311-macosx_10_9_x86_64.whl (32.6 kB 查看哈希)

上传于 CPython 3.11 macOS 10.9+ x86-64

immutables-0.20-cp310-cp310-win_amd64.whl (33.7 kB 查看哈希)

上传于 CPython 3.10 Windows x86-64

immutables-0.20-cp310-cp310-win32.whl (30.3 kB 查看哈希)

上传于 CPython 3.10 Windows x86

immutables-0.20-cp310-cp310-musllinux_1_1_x86_64.whl (95.5 kB 查看哈希)

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

immutables-0.20-cp310-cp310-musllinux_1_1_aarch64.whl (96.2 kB 查看哈希)

上传于 CPython 3.10 musllinux: musl 1.1+ ARM64

immutables-0.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (96.6 kB 查看哈希)

上传于 CPython 3.10 manylinux: glibc 2.17+ ARM64

immutables-0.20-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (96.9 kB 查看哈希)

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

immutables-0.20-cp310-cp310-macosx_11_0_arm64.whl (32.1 kB 查看哈希值)

上传时间: CPython 3.10 macOS 11.0+ ARM64

immutables-0.20-cp310-cp310-macosx_10_9_x86_64.whl (32.6 kB 查看哈希值)

上传时间: CPython 3.10 macOS 10.9+ x86-64

immutables-0.20-cp39-cp39-win_amd64.whl (33.7 kB 查看哈希值)

上传时间: CPython 3.9 Windows x86-64

immutables-0.20-cp39-cp39-win32.whl (30.3 kB 查看哈希值)

上传时间: CPython 3.9 Windows x86

immutables-0.20-cp39-cp39-musllinux_1_1_x86_64.whl (95.0 kB 查看哈希值)

上传时间: CPython 3.9 musllinux: musl 1.1+ x86-64

immutables-0.20-cp39-cp39-musllinux_1_1_aarch64.whl (95.7 kB 查看哈希值)

上传时间: CPython 3.9 musllinux: musl 1.1+ ARM64

immutables-0.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (96.1 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.17+ ARM64

immutables-0.20-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (96.3 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

immutables-0.20-cp39-cp39-macosx_11_0_arm64.whl (32.1 kB 查看哈希值)

上传时间: CPython 3.9 macOS 11.0+ ARM64

immutables-0.20-cp39-cp39-macosx_10_9_x86_64.whl (32.5 kB 查看哈希值)

上传时间: CPython 3.9 macOS 10.9+ x86-64

immutables-0.20-cp38-cp38-win_amd64.whl (33.7 kB 查看哈希值)

上传时间 CPython 3.8 Windows x86-64

immutables-0.20-cp38-cp38-win32.whl (30.3 kB 查看哈希值)

上传时间 CPython 3.8 Windows x86

immutables-0.20-cp38-cp38-musllinux_1_1_x86_64.whl (98.4 kB 查看哈希值)

上传时间 CPython 3.8 musllinux: musl 1.1+ x86-64

immutables-0.20-cp38-cp38-musllinux_1_1_aarch64.whl (99.2 kB 查看哈希值)

上传时间 CPython 3.8 musllinux: musl 1.1+ ARM64

immutables-0.20-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (101.0 kB 查看哈希值)

上传时间 CPython 3.8 manylinux: glibc 2.17+ ARM64

immutables-0.20-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (100.6 kB 查看哈希值)

上传时间 CPython 3.8 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

immutables-0.20-cp38-cp38-macosx_11_0_arm64.whl (32.1 kB 查看哈希值)

上传时间 CPython 3.8 macOS 11.0+ ARM64

immutables-0.20-cp38-cp38-macosx_10_9_x86_64.whl (32.6 kB 查看哈希值)

上传时间 CPython 3.8 macOS 10.9+ x86-64

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面