> Мой любимый желтый банк, например, обновляет сервера бэкендов мобильного приложения в 5 утра по Москве примерно 2 раза в неделю.
Один модный молодёжный банк для предпринимателей обновляет сервера онлайн-кассы в обед по Москве. Видно по волне ошибок синхронизации. «Потому что разработчики у нас в Новосибирске, им так удобней».
1) __iter__-__iter__ом, но ведь имеет значение, вызывать __iter__ у уже существующего инстанса или каждый раз создавать его перед вызовом?
2) range всё-таки может создать не любой список, а только «containing arithmetic progressions» (http://docs.python.org/library/functions.html#range). range('a', 'z') это вообще TypeError.
3) в конце-концов, можно позвать cProfiler, и проверить:
import cProfile
i = 5000
def xrange_xrange():
for x in xrange(i):
for y in xrange(i):
(x, y)
def xrange_prerange():
y_range = range(i)
for x in xrange(i):
for y in y_range:
(x, y)
for _ in range(10):
cProfile.run('xrange_xrange()')
cProfile.run('xrange_prerange()')
print '=' * 10
Сокращённый вывод:
==========
3 function calls in 7.061 CPU seconds
4 function calls in 6.022 CPU seconds
==========
3 function calls in 6.605 CPU seconds
4 function calls in 5.749 CPU seconds
==========
3 function calls in 6.548 CPU seconds
4 function calls in 5.927 CPU seconds
==========
3 function calls in 6.052 CPU seconds
4 function calls in 6.182 CPU seconds
==========
3 function calls in 5.970 CPU seconds
4 function calls in 5.966 CPU seconds
==========
3 function calls in 7.590 CPU seconds
4 function calls in 5.955 CPU seconds
==========
3 function calls in 6.167 CPU seconds
4 function calls in 5.867 CPU seconds
==========
3 function calls in 6.763 CPU seconds
4 function calls in 6.048 CPU seconds
==========
3 function calls in 5.988 CPU seconds
4 function calls in 5.690 CPU seconds
==========
3 function calls in 5.827 CPU seconds
4 function calls in 6.048 CPU seconds
==========
Т.е. эффект от выноса range() за внешний цикл хотя и не очень значительный, но есть.
Например, не создавать каждый раз в цикле xrange(width), а сделать в начале функции «width_range = range(width)», а внутри уже «for X in width_range:».
Но то, что xrange «почти всегда лучше» это немного некорректный вывод. Если надо меньше памяти, то, конечно, лучше xrange. Но если надо быстрее (а топик был именно о скорости), то избавившись от создания сотен или тысяч мелких одинаковых объектов, пусть даже генераторов, можно выиграть немного времени. Я проверял.
Ещё можно экономить на создании объектов. Например, не создавать каждый раз в цикле xrange(width), а сделать в начале функции «width_range = range(width)», а внутри уже «for X in width_range:».
Сам с 2006 года не пропустил ни одного фестиваля, влючая осеннюю мини-версию. Каждый раз после возвращения в город сильная ломка минимум на неделю — хочется назад, хочется ещё. Но в то же время я знаю как минимум одного человека, который приехал туда вечером, а утром сказал, что ему всё понятно насчёт этого места и этих людей, и, не дождавшись ни одного музыкального выступления, уехал.
Чуть меньше кода — 4: возвращение блудного верблюда
use utf8;
use List::Util 'shuffle';
$text = 'Практической пользы программа не несет, разве что прокачать навыки чтения и подгрузить мозг.';
$text =~ s/(?<=[а-яa-z])([а-яa-z]{2,})(?=[а-яa-z])/join('',shuffle(split('',$1)))/eg;
print "$text\n";
Протестую! badge в таком пуше будет «крутить» счётчик непрочитанных на иконке приложения.
Один модный молодёжный банк для предпринимателей обновляет сервера онлайн-кассы в обед по Москве. Видно по волне ошибок синхронизации. «Потому что разработчики у нас в Новосибирске, им так удобней».
2) range всё-таки может создать не любой список, а только «containing arithmetic progressions» (http://docs.python.org/library/functions.html#range). range('a', 'z') это вообще TypeError.
3) в конце-концов, можно позвать cProfiler, и проверить:
Сокращённый вывод:
==========
3 function calls in 7.061 CPU seconds
4 function calls in 6.022 CPU seconds
==========
3 function calls in 6.605 CPU seconds
4 function calls in 5.749 CPU seconds
==========
3 function calls in 6.548 CPU seconds
4 function calls in 5.927 CPU seconds
==========
3 function calls in 6.052 CPU seconds
4 function calls in 6.182 CPU seconds
==========
3 function calls in 5.970 CPU seconds
4 function calls in 5.966 CPU seconds
==========
3 function calls in 7.590 CPU seconds
4 function calls in 5.955 CPU seconds
==========
3 function calls in 6.167 CPU seconds
4 function calls in 5.867 CPU seconds
==========
3 function calls in 6.763 CPU seconds
4 function calls in 6.048 CPU seconds
==========
3 function calls in 5.988 CPU seconds
4 function calls in 5.690 CPU seconds
==========
3 function calls in 5.827 CPU seconds
4 function calls in 6.048 CPU seconds
==========
Т.е. эффект от выноса range() за внешний цикл хотя и не очень значительный, но есть.
Но то, что xrange «почти всегда лучше» это немного некорректный вывод. Если надо меньше памяти, то, конечно, лучше xrange. Но если надо быстрее (а топик был именно о скорости), то избавившись от создания сотен или тысяч мелких одинаковых объектов, пусть даже генераторов, можно выиграть немного времени. Я проверял.
Сам с 2006 года не пропустил ни одного фестиваля, влючая осеннюю мини-версию. Каждый раз после возвращения в город сильная ломка минимум на неделю — хочется назад, хочется ещё. Но в то же время я знаю как минимум одного человека, который приехал туда вечером, а утром сказал, что ему всё понятно насчёт этого места и этих людей, и, не дождавшись ни одного музыкального выступления, уехал.
(кстати, тоже пример: холмы.рф — не редирект).
#!/usr/bin/python
import re
print re.sub('\((.*?)\)', lambda m: m.group(1)[::-1], raw_input())
#!/usr/bin/python
import re
revstring = lambda s: ''.join(reversed(s))
print re.sub('\((.+?)\)', lambda m: revstring(m.group(1)), raw_input())