【问题标题】:Why does python have to generate the full range to test if float in range?为什么python必须生成完整范围来测试是否在范围内浮动?
【发布时间】:2019-02-21 06:05:36
【问题描述】:

这真的很快:

1 in range(100000000000000)

这真的很慢:

1.5 in range(100000000000000)

step 必须是整数时,为什么必须生成整个范围才能知道1.5 不在range(X) 中?

【问题讨论】:

  • 1 in range 将在第一个元素之后停止。当您检查不在您范围内的 int 时,速度如何?
  • 这也很快。如果数字除以步长的模不是 0,我会认为很明显数字不在范围内。
  • 我猜如果元素是整数会进行优化。范围内的“你好”(100000000000)也很慢
  • @CorentinLimier 我想就这么简单! 99999999.0 in range(100000000) 需要很长时间,但 99999999 in range(100000000) 不需要。
  • 我的猜测:范围内的浮点数很棘手,所以他们会彻底搜索?但是它应该在遇到大于针的范围内的值(它正在寻找的值)后尽早退出搜索?

标签: python python-3.x


【解决方案1】:

如果我们检查source code:

包含函数:

range_contains(rangeobject *r, PyObject *ob)
{
    if (PyLong_CheckExact(ob) || PyBool_Check(ob))
        return range_contains_long(r, ob);

    return (int)_PySequence_IterSearch((PyObject*)r, ob,
                                   PY_ITERSEARCH_CONTAINS);
}

它似乎会检查是否会使用整数或布尔方法进行检查,如果不是,则使用 PY_ITERSEARCH_CONTAINS。

【讨论】:

  • 即使不知道任何 c,也很清楚那里发生了什么,所以 +1。关于为什么的任何想法?太多的边缘案例?太贵了?只是不是用于浮动的功能?
猜你喜欢
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多