2011-03-16 20 views
3

爲了支持對集合的索引,Python包含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()沒有製作您的列表的裝飾副本。它需要像迭代器這樣的參數作爲它的參數,並返回類似於迭代器的結果,所以它或多或少地做了你的「手動」示例正在做的事情。