2011-03-16 8 views
3

コレクションのインデックス作成をサポートするPythonには、enumerate()関数が含まれています。これは、コレクションの上にインデックスを提供します。私の場合はenumerate()関数は、要素を事前にカウントしていますか?

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

私は巨大なリストを持っており、手動で使用enumerate()をインデックスを作成する方が速い場合だろうか?例えば

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

どうすれば列挙できますか?それは本質的にその実装です、なぜ組み込みが遅くなるのでしょうか?あなたはPEPにリンクしていて、その純粋な実装を提供しています。 –

答えて

5

enumerate関数が組み込まれています。それは先験的な要素を数えません。以下は、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; 
} 

、機能はオン・ザ・フライnexten整数を生成します。

1

いいえ、enumerate()はあなたのリストの装飾されたコピーを作成していません。引数としてイテレータのようなものをとり、結果としてイテレータのようなものを返します。したがって、あなたの "手動"の例が多かれ少なかれ実行しています。

関連する問題