跳转到主要内容

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 查看哈希)

上传时间 Python 3

由以下机构支持

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