Как стать автором
Обновить
8
0
Антон Григорьев @griganton

Разработчик

Отправить сообщение
В свою очередь, порекомендую попробовать отечественную разработку — Catboost, в последнее время он стал очень хорош.
Ну ра такая пьянка, то и Kaggle прикрутите :)
Да, на самом деле всё запоминается легко: питон ищет атрибут у самого объекта, потом у класса, а потом идет вверх по иеархии в соответствии с mro.
А где примеры хулиганства, рассказ хотя бы про monkey-patching и возможности, которые он открывает? Рассказать про то, как это все используется в тестировании и так далее? Как сделать пользовательский класс, которому нельзя назначить атрибут?

Вся статья ужимается до фразы «В питоне можно назначать атрибуты, но не всегда»
Когда читаю хабр на работе и вижу обсуждения неэффективных сотрудников, становится как-то… неловко что-ли.
В мире питона иногда кажется что все написано до нас…
Очень похоже на модуль redis-collections
А мне показалось, что тут отсылка на Айн Рэнд )
Перед комментарием гонял тесты на 2.7.11 |Anaconda 2.5.0 (64-bit) — там способ через set и list оказались одинаковы по скорости на четырёх элементах.

Написал комментарий скорей всего про то, чтобы мышление программиста не забывало про set, чтобы использовать его для проверок на вхождение. Ведь завтра может придётся написать программу, где придётся искать элемент среди сотни или тысячи элементов.
про Способ №3 — если в задаче нужно искать, является ли элемент частью какого-то множества, лучше ислопьзовать set (выглядит как словарь только из ключей: {"Y","y","Д","д"}), а не list. Всё дело в том, что проверка на вхождение у set имеет сложность О(1), а у list — O(N) (линейно растёт с увеличением количества элементов). На четырёх элементах конечно не заметно, но чем больше элементов — тем больше будет отрыв.

Способ №4, кстати, работает некорректно, так как ответ «деревня», например, воспримется как положительный ответ, хотя должен быть некорректный. Всё дело в том, что re.match пытается сматчить начало строки, и не обязательно, если вся остальная часть строки под регулярку не подходит, re.match вернёт объект матча, который приводится к True
прокрастинирую, читая эту статью…
Скорость ваших operator сравнима с моей, а лямбда — в 2 раза медленнее. Чем это может быть обусловлено? Это может быть интересно.
Моя система: Python 3.4.1 |Anaconda 2.1.0 (64-bit)| (default, Sep 24 2014, 18:32:42) [MSC v.1600 64 bit (AMD64)] on win32
Согласен! Ещё у меня была мысль вытащить операторы из класса floatfloat.__add__ и т.п., но некрасиво вытаскивать приватные методы из классов.

С операторами из модуля operator код меняется на:
import operator
OPERATORS = {'+': (1, operator.add), '-': (1, operator.sub),
             '*': (2, operator.mul), '/': (2, operator.truediv)}

Но в моих замерах я не заметил разницы в производительности.
С операторами из operator:
%timeit eval2("15/(7-(1+1))*3-(2+(1+1))*15/(7-(1+1))*3-(2+(1+1))*(15/(7-(1+1))*3-(2+(1+1))+15/(7-(1+1))*3-(2+(1+1)))")
10000 loops, best of 3: 141 µs per loop

С lambda функциями:
%timeit eval_("15/(7-(1+1))*3-(2+(1+1))*15/(7-(1+1))*3-(2+(1+1))*(15/(7-(1+1))*3-(2+(1+1))+15/(7-(1+1))*3-(2+(1+1)))")
10000 loops, best of 3: 143 µs per loop

Две миллисекунды не считается, это я мышкой шевелил!

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность