我想在一个巨大的列表中找到匹配并返回值。我使用以下内容:
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循环有什么不同?
答案 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中创建自己的版本快得多