Python 3中任何对象的“安全比较”(全序)
项目描述
在Python 2中,可以比较任何对象
>>> None > 2 False >>> [] < object() True
但在Python 3中,这不再成立
>>> None > 2 ... TypeError: '>' not supported between instances of 'NoneType' and 'int' >>> [] < object() ... TypeError: '<' not supported between instances of 'list' and 'object'
但在许多情况下,这是有用的,例如
对异构列表进行排序(即,包含许多类型对象的列表)
将对象与None进行比较(例如,找出列表中的max(...),其中一些项可能是None)
编写具有鲁棒、确定性行为的通用函数
safe_cmp提供了用于在Python 3中安全排序和排序任何值的函数。在数学术语中,safe_cmp实现了Python 3中所有值的全序[1]。
safe_cmp实现了Python 2兼容的安全排序函数版本
safe_cmp:Python 3的兼容实现cmp
safe_sorted:安全版本的sorted(...)
safe_min:安全版本的min(...)
safe_max:安全版本的max(...)
并提供了一个包装器 - safe_order - 它为任何对象定义了全序(例如,heterogeneous_list.sort(key=safe_order))。
示例
对异构列表进行排序
>>> from safe_cmp import safe_sorted, safe_order
>>> items = [1, None, "foo", {}, object]
>>> list(safe_sorted(items)) # Using "safe_sorted"
[None, {}, 1, 'foo', object]
>>> items.sort(key=safe_order) # Using "safe_order" with key=
>>> items
[None, {}, 1, 'foo', object]
在包含nulls的列表中查找最大值
>>> from safe_cmp import safe_max
>>> safe_max([1, None, 3, None, 4])
4
Python 2风格cmp有用的罕见情况
>>> from safe_cmp import safe_cmp
>>> safe_cmp(None, 1)
-1
>>> safe_cmp(None, None)
0
>>> safe_cmp(1, None)
1
注意:当使用 nan 时,safe_cmp 将产生与 Python 2 兼容的结果
>>> from safe_cmp import safe_cmp
>>> nan = float("NaN")
>>> safe_cmp(nan, 1)
-1
>>> safe_cmp(1, nan)
1
>>> safe_cmp(nan, nan)
0
同样,safe_sorted 也会如此
>>> from safe_cmp import safe_sorted
>>> list(safe_sorted([nan, 2, nan, 1]))
[nan, 2, nan, 1]
性能
目前,safe_cmp 方法在 Python 中实现(与它们的非安全内置对应方法相反,后者在 C 中实现),因此对于大型比较性能会明显较差
In [1]: %timeit safe_max(range(10000000)) 2.8 s ± 42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [2]: %timeit max(range(10000000)) 345 ms ± 6.23 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
但对于较小的比较,差异将是微不足道的
In [1]: %timeit safe_max(1, 2) 682 ns ± 7.12 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) In [2]: %timeit max(1, 2) 218 ns ± 6.87 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
然而,如果对高性能实现感兴趣,它们将很容易提供。
此外,在明显的地方已实现了性能优化(例如,缓存 key= 函数的结果)。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分布
safe_cmp-0.1.1.tar.gz (5.3 kB 查看哈希)
构建分布
safe_cmp-0.1.1-py3-none-any.whl (5.2 kB 查看哈希)
关闭
safe_cmp-0.1.1.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | dd0f984fb9ac4ae95b0d608e8d78801780fdcac432878841b31e27ec93e58114 |
|
MD5 | bdc5ec0ef5ff1f97ac418d64fb5626da |
|
BLAKE2b-256 | 529ec9ad3a175e8b14825a7eb2be4739650669dfcd99c931217ab3401290361a |
关闭
safe_cmp-0.1.1-py3-none-any.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0d38f011f25f6434ac453a6bdd1958b0da71181da49bfdfda356e6e5865d8579 |
|
MD5 | 35144d1235dde17e2e8165d937d91f8e |
|
BLAKE2b-256 | 0c752e781123e11431bf99ad2fbf42f8c685e07545f9a610d8756092de9f94e0 |