ask forgiveness, not permission некоторыми считается каноническим питоном. Но нужно использовать с умом: если ожидается, что чаще всего значения не будет, то исключения, конечно, добавят оверхед, и желательно их избегать.
Вообще считаю неуместным говорить про скорость в питоне - он не быстрый по определению. У вас вон в цикле конкатенация строк, я ж не жалуюсь :) Поэтому я считаю, что писать нужно максимально простой и читаемый код (и если suppress позволяет этого достичь - то не вижу причин не использовать его только из-за гипотетического оверхеда). Если видим, что тормозит - тогда да, начинаем оптимизировать или берём какой-нибудь numpy / rust.
Python просто не позволяет выразить это намерение явно средствами языка
if val := dic.get(key):
print(val)
или
with suppress(KeyError):
val = dic[key]
print(val)
И ещё: автоматическое скачивание модуля при использовании - это очень, очень плохо. Как насчёт version pinning / dependency resolution / указания репозитория, откуда скачивается? Это лишь малые проблемы, которые сходу приходят в голову.
Совершенно не понимаю, почему просто не прикрутить какой-нибудь шаблонизатор. HTML, смешанный с языковыми конструкциями, выглядит ужасно. Получается какой-то php
Ok, so I decided to use the test_trimesh trimesh to make sure everything was working ok. So everything seems to work fine, but I get an error in my collide callback I get a fat access violation. Urrrrrrrrrrrrrgh this triangle collider is really making me mad ><
Why is dVector3 the same size as dVector4? Why is a dMatrix not 3x3? For making it SIMD friendly. i.e 16 byte aligned (there is no SIMD code in there right now, but there may be in the future).
Ну прям совсем ноунейм не добавили бы в репозитории убунты и, в особенности, дебиана :) Но да, там маленькое коммьюнити. Питон, знаете, тоже когда-то был ноунейм)
Разрабы говорят, что четыре координаты нужны для "better alignment", наверно для работы с кватернионами там им удобнее, когда сразу 4x1, чтобы память не перекладывать.
Кубики работали, потому что у них интерфейс без этих выкрутасов с векторами, просто задаются размеры куба, и готово: proc createBox*(space: dSpaceID; lx: dReal; ly: dReal; lz: dReal): dGeomID. Ошибиться сложно, даже для меня :)
Во-первых, она Арина. Во-вторых, в отличие от Ивана, она свой код в публичный доступ не выкладывала, поэтому вот так вот лихо им делиться без её согласия я не могу ¯\_(ツ)_/¯ Если вы сгораете от любопытства, то можете написать ей сами - легко ищется во вконтакте.
Делаю то, с чем не справляется сбер. Ведь вывесить результаты на сайте слишком сложно. Кто эти люди? Где код? Как сравнить? Да хрен его знает.
? Сбер подвел итоги конкурса красоты кода
Ранее мы писали о соревновании для программистов, в котором участники боролись за ценные призы, и вчера Сбер подвел долгожданные итоги:
— В конкурсе приняло участие более 1000 человек со всей России; — Свои призы забрали программисты и разработчики из Москвы, Санкт-Петербурга, Самары, Владивостока, Томска, Иванова, Барнаула, Краснодара и других регионов России;
?Среди 15 победителей оказалась и 1 настоящая краса кода — девушка-прогер.
Победители были награждены новенькими iPhone 14 и смарт-колонками SberBoom Mini. Церемония награждения состоялась на конференции SmartDev
У нас есть подписки (Subscription) и платежи (SubscriptionPayment) с ForeignKey к подписке. Есть функция для продления подписки. Пусть она вызывается параллельно из 2 потоков.
Первый поток:
Находит Subscription, которую пора продлевать
Ищет, был ли SubscriptionPayment, скажем, за последние 3 дня - не находит - значит, пора списывать
Триггерит внешний API для списания денег клиента
Параллельно второй поток:
Находит Subscription, которую пора продлевать
Ищет, был ли SubscriptionPayment, скажем, за последние 3 дня - не находит - значит, пора списывать
Триггерит внешний API для списания денег клиента
Первый поток: 4. Если внешний API отработал без ошибок, то создаёт SubscriptionPayment
Второй поток: 4. Если внешний API отработал без ошибок, то создаёт SubscriptionPayment
SELECT_FOR_UPDATE делает так, что на первом шаге один из потоков получает блокировку на Subscription, и второй поток ждёт, пока первый поток не разлочит Subscription в конце транзакции (т.е. уже после создания SubscriptionPayment). Когда второй поток переходит к шагу 2, он уже находит существующий платёж.
Вы ещё забыли добавить, что EvaTeam разрабатывается ООО Карбон Софт, которые делают любимый всеми DPI, как сами говорят:
https://www.carbonsoft.ru/products/carbon-reductor/
Публика требует подробностей!
Ага, я неправильно написал в статье :(
Self
нужен в основном, чтобы аннотировать classmethod'ы - этот type hint означает, что возвращается инстанс текущего класса:Никогда не видел, чтобы кто-то аннотировал
self
delМне сэмпл понравился, я, походу, псина
ask forgiveness, not permission некоторыми считается каноническим питоном. Но нужно использовать с умом: если ожидается, что чаще всего значения не будет, то исключения, конечно, добавят оверхед, и желательно их избегать.
Вообще считаю неуместным говорить про скорость в питоне - он не быстрый по определению. У вас вон в цикле конкатенация строк, я ж не жалуюсь :) Поэтому я считаю, что писать нужно максимально простой и читаемый код (и если suppress позволяет этого достичь - то не вижу причин не использовать его только из-за гипотетического оверхеда). Если видим, что тормозит - тогда да, начинаем оптимизировать или берём какой-нибудь numpy / rust.
или
И ещё: автоматическое скачивание модуля при использовании - это очень, очень плохо. Как насчёт version pinning / dependency resolution / указания репозитория, откуда скачивается? Это лишь малые проблемы, которые сходу приходят в голову.
Совершенно не понимаю, почему просто не прикрутить какой-нибудь шаблонизатор. HTML, смешанный с языковыми конструкциями, выглядит ужасно. Получается какой-то php
Ну как бы да, мануал наше всё, но я ещё примеры от других людей смотрю, туториалы там всякие почитываю. И везде эта ошибка встречается.
Вот, например, неправильная подсказка, потому что автор забыл про то, что это 4D вектор:
Или вот чел наступил на те же грабли, что и я:
И вот ещё один погорелец:
Вы использовали double precision и фиксированный шаг симуляции? Если да, и при этом всё равно словили глюки, то это печально
Я не поленился:
http://ode.org/wiki/index.php/Manual#Why_is_dVector3_the_same_size_as_dVector4.3F_Why_is_a_dMatrix_not_3x3.3F
Ну прям совсем ноунейм не добавили бы в репозитории убунты и, в особенности, дебиана :) Но да, там маленькое коммьюнити. Питон, знаете, тоже когда-то был ноунейм)
Разрабы говорят, что четыре координаты нужны для "better alignment", наверно для работы с кватернионами там им удобнее, когда сразу 4x1, чтобы память не перекладывать.
Кубики работали, потому что у них интерфейс без этих выкрутасов с векторами, просто задаются размеры куба, и готово:
proc createBox*(space: dSpaceID; lx: dReal; ly: dReal; lz: dReal): dGeomID
. Ошибиться сложно, даже для меня :)Отдельные поля класса - этот сниппет кода прилагался к задаче, идея организаторов. Я бы до такого не додумался, наоборот, выбесило знатно.
Этот код не для продакшна, его 1 (или 0) раз посмотрят и выбросят навсегда. В этом контексте считаю шутейки уместными.
Во-первых, она Арина. Во-вторых, в отличие от Ивана, она свой код в публичный доступ не выкладывала, поэтому вот так вот лихо им делиться без её согласия я не могу
¯\_(ツ)_/¯
Если вы сгораете от любопытства, то можете написать ей сами - легко ищется во вконтакте.Делаю то, с чем не справляется сбер. Ведь вывесить результаты на сайте слишком сложно.
Кто эти люди? Где код? Как сравнить? Да хрен его знает.
? Сбер подвел итоги конкурса красоты кода
Ранее мы писали о соревновании для программистов, в котором участники боролись за ценные призы, и вчера Сбер подвел долгожданные итоги:
— В конкурсе приняло участие более 1000 человек со всей России;
— Свои призы забрали программисты и разработчики из Москвы, Санкт-Петербурга, Самары, Владивостока, Томска, Иванова, Барнаула, Краснодара и других регионов России;
?Среди 15 победителей оказалась и 1 настоящая краса кода — девушка-прогер.
Победители были награждены новенькими iPhone 14 и смарт-колонками SberBoom Mini. Церемония награждения состоялась на конференции SmartDev
https://t.me/c/1396952381/9755
Имхо не хватает докер-образа какого-нибудь
У нас есть подписки (Subscription) и платежи (SubscriptionPayment) с ForeignKey к подписке.
Есть функция для продления подписки. Пусть она вызывается параллельно из 2 потоков.
Первый поток:
Находит Subscription, которую пора продлевать
Ищет, был ли SubscriptionPayment, скажем, за последние 3 дня - не находит - значит, пора списывать
Триггерит внешний API для списания денег клиента
Параллельно второй поток:
Находит Subscription, которую пора продлевать
Ищет, был ли SubscriptionPayment, скажем, за последние 3 дня - не находит - значит, пора списывать
Триггерит внешний API для списания денег клиента
Первый поток:
4. Если внешний API отработал без ошибок, то создаёт SubscriptionPayment
Второй поток:
4. Если внешний API отработал без ошибок, то создаёт SubscriptionPayment
SELECT_FOR_UPDATE
делает так, что на первом шаге один из потоков получает блокировку на Subscription, и второй поток ждёт, пока первый поток не разлочит Subscription в конце транзакции (т.е. уже после создания SubscriptionPayment). Когда второй поток переходит к шагу 2, он уже находит существующий платёж.Если я где-то туплю - дайте знать. Я могу.