2014-12-30 2 views
1

Я создаю новый список из большого старого списка на основе определенного значения, не равного None. Какой метод итерации работает быстрее?Какой метод быстрее для итерации Python?

Вариант 1:

new_list = [] 
for values in old_list: 
    if values[4] is not None: 
     new_list.append(values[4]) 

Вариант 2:

new_list = [x for x in old_list if x[4] is not None] 
+7

Вы можете проверить это самостоятельно, используя модуль ['timeit'] (https://docs.python.org/2/library/timeit.html). – iCodez

+3

У меня есть запрос. Не помещайте пробел между 'new_list' и' .append'. Я не мог найти ничего в руководстве по стилю Python, специально запрещающего его, поэтому просто подумайте, что это личная услуга для меня ;-) – Kevin

+0

@Kevin - услуга предоставлена! – user2242044

ответ

5

Попробуйте timeit обоих.

Но второй широко распространен known to be faster.

В основном map быстрее, чем list comprehension, который быстрее, чем for loop.

A вся статья литературы доступна в Интернете по этому вопросу.

EDIT:

Я обещал обновление с реальными, ощутимыми результатами. Вот код.

import random 
import timeit 

old_list = [ random.randint(0, 100000) for i in range(0, 100) ] 


def floop(old_list): 
    new_list = [] 
    for value in old_list: 
     new_list.append(value) 
    return new_list 


def lcomp(old_list): 
    new_list = [ value for value in old_list ] 
    return new_list 


if __name__=='__main__': 
    results_floop = timeit.Timer('floop(old_list)', "from __main__ import floop, old_list").timeit() 
    results_lcomp = timeit.Timer('lcomp(old_list)', "from __main__ import lcomp, old_list").timeit() 
    print("Function\t\tSeconds elapsed") 
    print("For loop\t\t{}".format(results_floop)) 
    print("List comp\t\t{}".format(results_lcomp)) 

Помните: timeit петли через вызываемой функции 1 миллиона раз и выводит время, прошедшее в секундах. Прочитайте его как , чтобы выполнить это 1 миллион раз, потребовалось xx секунд.

Вот результаты. Я думаю, что они говорят сами по себе.

~/python » python3 lists.py 
Function  Seconds elapsed 
For loop  11.089475459069945 
List comp  5.985794545034878 
+1

Возможно, вы захотите добавить некоторые ваши собственные результаты в случае, если ссылка когда-либо гниет. – Ffisegydd

+0

@Ffisegydd, вы правы - скоро будет обновлять этот ответ с некоторыми результатами – Jivan

+0

Прохладный, я не знал о timeit. Я выбрал это как лучший ответ, но все равно хотел бы увидеть этот пример. – user2242044

1

Вторая и быстрее, и более читаема. Если вам нужна более высокая скорость и только один раз повторяйте результат, вы можете использовать filter - new_list = filter(lambda x: x[4] is not None, old_list). Вы можете вызвать list по отфильтрованному результату, но это может не иметь никакого преимущества по сравнению с пониманием списка (и меньше Pythonic IMHO).

+0

прохладно добавить третий альтернативный метод – Jivan

Смежные вопросы