为什么使用.index()比使用for循环更快?

时间:2015-06-10 23:40:11

标签: python-2.7

我想在一个巨大的列表中找到匹配并返回值。我使用以下内容:

def func(x)
    for i in list:
        if i == x:
        return i
    return False

令人惊讶的是,在用.index:

替换此方法之后
def func(x):
    try:
        return i.index(x)
    except Valueerror:
        return False  

测试时间减少了10倍。这是为什么?或者index和for循环有什么不同?

2 个答案:

答案 0 :(得分:1)

出于效率原因,Array类直接在C中实现(至少在Ruby的MRI版本中),因此它更快。

此处the source

               static VALUE
rb_str_index_m(int argc, VALUE *argv, VALUE str)
{
    VALUE sub;
    VALUE initpos;
    long pos;

    if (rb_scan_args(argc, argv, "11", &sub, &initpos) == 2) {
        pos = NUM2LONG(initpos);
    }
    else {
        pos = 0;
    }
    if (pos < 0) {
        pos += str_strlen(str, NULL);
        if (pos < 0) {
            if (RB_TYPE_P(sub, T_REGEXP)) {
                rb_backref_set(Qnil);
            }
            return Qnil;
        }
    }

    if (SPECIAL_CONST_P(sub)) goto generic;
    switch (BUILTIN_TYPE(sub)) {
      case T_REGEXP:
        if (pos > str_strlen(str, NULL))
            return Qnil;
        pos = str_offset(RSTRING_PTR(str), RSTRING_END(str), pos,
                         rb_enc_check(str, sub), single_byte_optimizable(str));

        pos = rb_reg_search(sub, str, pos, 0);
        pos = rb_str_sublen(str, pos);
        break;

      generic:
      default: {
        VALUE tmp;

        tmp = rb_check_string_type(sub);
        if (NIL_P(tmp)) {
            rb_raise(rb_eTypeError, "type mismatch: %s given",
                     rb_obj_classname(sub));
        }
        sub = tmp;
      }
        /* fall through */
      case T_STRING:
        pos = rb_str_index(str, sub, pos);
        pos = rb_str_sublen(str, pos);
        break;
    }

    if (pos == -1) return Qnil;
    return LONG2NUM(pos);
}

答案 1 :(得分:1)

因为python内置函数是用C实现的,而python代码是用C代码循环运行的。

所以当你使用在C中实现的python函数时,它会比在python中创建自己的版本快得多