Форум сайта python.su
smoke853
В смысле какая скорость? в первом случае время выполнения = 0.755, во втором = 0.002, очевидно что второй вариант работает быстрее.
Офлайн
Budulianin
Естественно создать генератор быстрее. А вот когда потребуется, чтобы твой генератор выдал значение, потратится ещё время, на его вычисление.
Офлайн
smoke853
Да, понятно что потратится еще время на его вычисление, допустим: n-e время потратится на создание генератора + n-е время потратится на вычисление, но я думаю что время выполнения будет все равно быстрее чем если бы использовался return или я ошибаюсь?
Отредактировано Budulianin (Дек. 4, 2013 17:27:42)
Офлайн
BudulianinНу примерно так и думал , конечно все не взлетит, но думал что в разы будет работать быстрее.
Или ты думаешь, что напишешь волшебное слово yield и всё взлетит ?
Офлайн
smoke853
Ну примерно так и думал , конечно все не взлетит, но думал что в разы будет работать быстрее.
Отредактировано Budulianin (Дек. 4, 2013 17:38:41)
Офлайн
>>> with open('/etc/passwd', encoding='utf-8') as fin: ... line = next(filter(lambda s: s.split(':')[0] == 'ftp', fin)) ... >>> line 'ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin\n' >>>
Офлайн
py.user.next
filter перебирает все элементы
Офлайн
Budulianinнет, это итератор
filter перебирает все элементы
>>> it = filter(None, [1, 2, 3]) >>> it <filter object at 0x7fd71400ca50> >>> next(it) 1 >>> next(it) 2 >>> next(it) 3 >>> next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>
Офлайн
py.user.nextИмеется ввиду, что после того, как он найдет нужный элемент, итерация все равно будет выполнена до конца.
нет, это итератор
Офлайн
Budulianin
Вообще-то генератор списков это просто “синтаксический сахар” и по реализации ничем не отличается, от обычного for. Следовательно он работает с такой же скоростью.
def func1(): lst = [x for x in range(10000)] def func2(): lst = [] for x in range(10000): lst.append(x) t1 = timeit.Timer(func1, 'from __main__ import func1') t2 = timeit.Timer(func2, 'from __main__ import func2') t1.repeat(3, 1000) [1.3615523760017822, 1.1045241789979627, 1.1151962050025759] t2.repeat(3, 1000) [2.1324967270011257, 2.1218632529999013, 2.120350769997458]
Отредактировано Budulianin (Дек. 6, 2013 22:47:59)
Офлайн