enumerate() 函数是否预先计算元素数?

发布于 2024-10-23 16:25:44 字数 448 浏览 6 评论 0原文

为了支持对集合进行索引,Python 包含 enumerate() 函数。它提供集合索引。

for index, item in enumerate(list):
    # do domething
    print index

就我而言,我有一个巨大的列表,想知道使用 手动创建索引是否更快枚举()?例如

index = 0
for item in list:
    # do something
    print index
    index = index + 1

To support indexing over a collection Python includes enumerate() function. It provides index over collection.

for index, item in enumerate(list):
    # do domething
    print index

In my case I have a huge list and wonder if it is faster to create index manually that use enumerate()? e.g.

index = 0
for item in list:
    # do something
    print index
    index = index + 1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

与他有关 2024-10-30 16:25:44

内置enumerate函数;它不先验地计算元素。 是 C 代码实现

static PyObject *
enum_next(enumobject *en)
{
    PyObject *next_index;
    PyObject *next_item;
    PyObject *result = en->en_result;
    PyObject *it = en->en_sit;

    next_item = (*it->ob_type->tp_iternext)(it);
    if (next_item == NULL)
        return NULL;

    next_index = PyInt_FromLong(en->en_index);
    if (next_index == NULL) {
        Py_DECREF(next_item);
        return NULL;
    }
    en->en_index++; 

    if (result->ob_refcnt == 1) {
        Py_INCREF(result);
        Py_DECREF(PyTuple_GET_ITEM(result, 0));
        Py_DECREF(PyTuple_GET_ITEM(result, 1));
    } else {
        result = PyTuple_New(2);
        if (result == NULL) {
            Py_DECREF(next_index);
            Py_DECREF(next_item);
            return NULL;
        }
    }
    PyTuple_SET_ITEM(result, 0, next_index);
    PyTuple_SET_ITEM(result, 1, next_item);
    return result;
}

以下 函数即时生成一个 next en 整数。

The enumerate function is built in; it does not count the elements a priori. The following is the C-code implementation:

static PyObject *
enum_next(enumobject *en)
{
    PyObject *next_index;
    PyObject *next_item;
    PyObject *result = en->en_result;
    PyObject *it = en->en_sit;

    next_item = (*it->ob_type->tp_iternext)(it);
    if (next_item == NULL)
        return NULL;

    next_index = PyInt_FromLong(en->en_index);
    if (next_index == NULL) {
        Py_DECREF(next_item);
        return NULL;
    }
    en->en_index++; 

    if (result->ob_refcnt == 1) {
        Py_INCREF(result);
        Py_DECREF(PyTuple_GET_ITEM(result, 0));
        Py_DECREF(PyTuple_GET_ITEM(result, 1));
    } else {
        result = PyTuple_New(2);
        if (result == NULL) {
            Py_DECREF(next_index);
            Py_DECREF(next_item);
            return NULL;
        }
    }
    PyTuple_SET_ITEM(result, 0, next_index);
    PyTuple_SET_ITEM(result, 1, next_item);
    return result;
}

So, the function yields a next en integer on the fly.

ζ澈沫 2024-10-30 16:25:44

不, enumerate() 不会制作列表的装饰副本。它接受类似迭代器的东西作为其参数,并返回类似迭代器的东西作为其结果,因此它或多或少地执行“手动”示例正在执行的操作。

No, enumerate() isn't making a decorated copy of your list. It takes a something like an iterator as its argument and returns something like an iterator as its result, so it's doing more or less what your "manual" example is doing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文