2016-04-19 1 views
1

Давайте предположим, что у меня есть список:Python: печатать символы - вложенный цикл или объединение строки?

cities = ['Berlin','London','Chicago'] 

И я хотел бы напечатать каждую букву в этом списке индивидуально.

Является ли один из этих способов более эффективным или рекомендуемым?

Это:

for c in cities: 
    for l in c: 
     print l 

или это:

for l in ''.join(cities): 
    print l 

ответ

1

Ничто не «более эффективно», без контекста.

Вложенные циклы будут работать в любом списке городов, какими бы большими они ни были, при условии, что вам удалось его построить в первую очередь. Он имеет дополнительные накладные расходы на запуск внешнего цикла, который повторно повторно инициализирует внутренний цикл.

Второе исключает это, но ему необходимо построить вторую копию всех данных ''.join(cities) для повторения итерации. Если ваш список городов достаточно велик или ваша среда достаточно короткая в памяти, это не удастся, если первая из них будет успешной. Кроме того, он генерирует больше мусора, который потребует рекультивации.

Почти наверняка либо вы получите работу достаточно быстро, если только вы не разрабатываете встраиваемую в гороховую систему встроенную систему с очень ограниченной оперативной памятью. В целом на современных ПК-системах с ГГц-процессорами и Гбайтами ОЗУ эффективность не должна быть вашим первым рассмотрением. Исключением является то, что вы можете предсказать, что объем данных, необходимых для сборки в ОЗУ, может превысить объем доступной ОЗУ, и в этом случае стоит избегать полных промежуточных копий. Другое - там, где у вас есть алгоритмы разного порядка и не может абсолютно гарантировать, что количество данных всегда останется небольшим. В этом случае предпочитайте алгоритм более низкого порядка. O (N) превосходит O (N^2) в огромной степени, когда N становится большим!

4

"что было бы более эффективным" часто зависит от операционной системы и других факторов. Тем не менее, вы могли бы сделать очень простой тест:

cities = ['Berlin','London','Chicago'] 
import time 

start = time.time() 
for x in range(100000): 
    for c in cities: 
     for l in c: 
      pass 
end = time.time() 
print "method 1: " + str(end-start) 

start = time.time()   
for x in range(100000):  
    for l in ''.join(cities): 
     pass 
end = time.time() 
print "method 1: " + str(end-start) 

На окнах 8 с питоном 2.7 я получил:

method 1: 0.218999862671 
method 1: 0.141000032425 

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

В любом случае, звук, как будто вы попадаете в бесполезные преждевременные оптимизации. Вы уверены, что вам действительно нужен этот уровень эффективности?

1

Вот третий вариант, который вы должны проверить (скорость будет зависеть от случая использования):

print '\n'.join(''.join(cities)) 

, потому что каждый вызов печати имеет совсем немного накладных расходов, так что часто хорошо использовать, как мало, как возможно (один в этом случае).

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