2016-08-31 4 views
-2

Я пытаюсь перебрать список элементов, однако список может быть массивным и требует слишком много времени для выполнения. Я использую газету api. Для контура I Построенное:Самый эффективный способ перебора списка элементов. Python 2.7

for article in list_articles: 

Каждая статья в list_articles являются объектом в формате:

<newspaper.article.Article object at 0x1103e1250> 

я проверил, что некоторые рекомендуется использовать xrange или диапазон, однако, что не работает в мой случай, что дает ошибку типа:

TypeError: 'int' object is not iterable 

было бы удивительным, если кто-нибудь может мне точку в правильном направлении или дать мне некоторое представление о том, что может увеличить efficietly Перебор в этом списке.

+1

Вы попробовали 'for x in range (len (list_articles)):'? Скорее всего, вы получаете 'TypeError', потому что вы просто делали' for x in len (list_articles): ' – perfect5th

+7

Узкое место здесь не так, как вы повторяете, и меняете на' xrange' или что бы это не сделало быстрее - на самом деле наоборот. Проблема гораздо более вероятна в том, что вы делаете внутри цикла, или в некоторых плохо разработанных аспектах общей структуры вашего кода. – user2357112

+2

У вас уже есть список, и метод, который вы используете для итерации, является наиболее эффективным.Поскольку вы говорите, что есть много статей, вам нужно будет избавиться от списка, и единственный способ сделать это - создать пользовательский итератор, который тянет газетную статью, используя api, и кэширует только некоторые из них, чтобы избежать сети накладные расходы. Этот итератор может затем предоставлять статью каждый раз, когда она вызывается в цикле, и извлекает некоторые из них, когда кеш становится устаревшим или заканчивается – smac89

ответ

1

Лучшим способом является использование встроенных функции, когда это возможно, например, функции разделения строк, объединения строк, групповых вещей и т. д.

Если есть возможность составить список или map. Если вам нужно построить один список из другого, манипулируя каждым элементом, то это он.

Жажда наилучшего способа - это цикл for item in items.

ДОБАВЛЕНО

Одна из вещей, которая делает вас Python программист, лучший программист, перенесет вас на следующий уровень программирования является второй вещью, которую я упомянул - список понимание и карта. Много раз вы перебираете список только для создания чего-то, что можно легко сделать с пониманием списка. Например:

new_items = [] 
for item in items: 
    if item > 3: 
    print(item * 10) 
    new_items.append(item * 10) 

Вы могли бы сделать это гораздо лучше (короче и быстрее и надежнее), как это:

new_items = [item * 10 for item in items if item > 3] 
print(items) 

Теперь, печать немного отличается от первого примера, но чаще чем нет, это не имеет значения, и даже лучше, а также может быть преобразовано с одной строкой кода в то, что вам нужно.

-1

Вот небольшой тест, чтобы сделать этот вопрос немного более интересным:

import timeit 
import random 

N = 1000000 


class Foo: 

    def __init__(self): 
     self.n = random.randint(0, 1000) 

bar = [Foo() for r in xrange(N)] 


def f1(lst): 
    return [v for v in lst] 


def f2(lst): 
    return [v for index, v in enumerate(lst)] 


def f3(lst): 
    return [lst[i] for i in range(len(lst))] 

K = 100 
print timeit.timeit('f1(bar)', setup='from __main__ import f1, bar', number=K) 
print timeit.timeit('f2(bar)', setup='from __main__ import f2, bar', number=K) 
print timeit.timeit('f3(bar)', setup='from __main__ import f3, bar', number=K) 

В моей машине дает:

5.1150355947 
6.89524135475 
7.90469366922 
[Finished in 22.1s] 

Вывод: Итерация с использованием идиомы for v in huge_list является действительно хорошим выбором, поэтому вы должны проконтролировать, где находится узкое место, которое, вероятно, во внутреннем цикле (обработка элементов)

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/13529260) – Hcorg

+0

Hcorg: Я не знаю, о чем вы говорите ... Я думаю, что это доказывает, что итерация, подобная OP, возможно, является одной из лучшие способы перебора огромного списка. Итак, не могли бы вы рассказать? Что-то не так с текущим эталоном? Потому что я вообще не понимаю ваш нисходящий рейтинг: P – BPL

+0

1. Прежде чем отредактировать этот пост, не было четкого ответа - просто какой-то бенчмарк :) 2. Я не давал downvote – Hcorg

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