LINUX.ORG.RU

Вопрос по python.

 


0

1
s = "hello hello hello hello hello"
for word in s.split(' '):
   print word

Конструкция во второй строке, бегущая по списку, сгенерированному s.split(' ') - аналогична ли она по производительности этому коду:

...
words = s.split(' ')
for word in words:
...
?

Ответ на: комментарий от anonymous

Хотя нет, ребенок как раз взял бы и проверил.

anonymous
()

Разбери, как работает for в Python.
Цикл берет переданный в него объект, получает от него итератор (обычно дергается соответствующий специальный метод объекта _iter_), объект посылается нафиг, а итерация производится по полученному итератору (дергается метод next итератора), до тех пор, пока он не кинет исключение StopIteration. Это исключение цикл воспринимает как сигнал о завершении обхода.
Всё. С помощью знания этих деталей реализации можно запиливать кастомные объекты, которые будут работать в цикле for, как родные.
В твоем случае список s.split(" ") (кстати, ЕМНИП, можно просто s.split(), или s.split(None), это дефолтное поведение .split - разбиение по пробелам) будет вычислен один раз. А потом подобран сборщиком мусора, поскольку не привязан ни к одной переменной.

Virtuos86 ★★★★★
()

В обоих случаях создаются объекты (списки) для s.split(' '), только в первом случае объект неименованный. Так что аналогична.

Xenesz ★★★★
()

Одно и то же. Первый вариант более лаконичный, и понятный... А работает код одинаково в любом случае.

lucentcode ★★★★★
()
Ответ на: комментарий от chinarulezzz

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

(i for i in s.split(None))
chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

А ничего что у тебя «полный список» создается внутри генератора из-за s.split(None)? И нафига там None?

anonymous
()
Ответ на: комментарий от anonymous

кусок гавна в зеркале увидишь) А ТС спросил о производительности. Выше ответили. Я добавил лишь еще вариацию такой простой задачи.

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

Вариацию говна ты создал (копия списка, который создается вызовом str.split()), которая совершенно не в тему.

anonymous
()
Ответ на: комментарий от anonymous

А ничего что у тебя «полный список» создается внутри генератора из-за s.split(None)?

>>> s = "hello world three four five"
>>> m = (i for i in s.split())
>>> m
<generator object <genexpr> at 0x8149f2c>
>>> m.next()
'hello'
>>> m.next()
'world'
>>> m.next()
'three'
>>> m.next()
'four'
>>> m.next()
'five'
>>> m.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

И нафига там None?

Можно и без None, можно и с None. Без разницы, если по пробелам.

chinarulezzz ★★
()
Ответ на: комментарий от anonymous

Откуда и как по-твоему генератор твой берет данные?

и?

import dis

def list_ex():
	s = "one two three four five"
	s1 = [i for i in s.split()]

def iter_ex():
	s = "one two three four five"
	s2 = (j for j in s.split())
	
print "LIST: \n", dis.dis(list_ex), "\n"
print "ITER: \n", dis.dis(iter_ex)

смотри сам)

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

cравнивает [i for i in s.split()] и (j for j in s.split())

О боги! Ты невменяем.

anonymous
()
Ответ на: комментарий от chinarulezzz

Так создаётся там полный список в генераторе или не создаётся? Кому верить - этому куску говна анонимусу или вам? (-;;;

kiverattes ★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.