Прежде чем внедрять оптимизацию производительности за счет читабельности, изучите такие модули, как psyco, которые будут выполнять JIT-компиляцию различных функций, часто с потрясающими результатами, без ухудшения читаемости.
Тогда, если вы действительно хотите встать на путь оптимизации, вы должны сначала научиться измерять и профилировать. Оптимизация ДОЛЖНА БЫТЬ КОЛИЧЕСТВЕННОЙ - не идти вразрез. Профилировщик точек доступа покажет вам функции, в которых ваша программа чаще всего перегорает.
Если оптимизация включает такую функцию, ее часто называют:
def get_order_qty(ordernumber):
# look up order in database and return quantity
Если есть какое-либо повторение порядковых номеров, то запоминание будет хорошим методом для изучения, и его легко упаковать в декоратор @memoize, так что это мало влияет на читаемость программы. Эффект запоминания заключается в том, что значения, возвращаемые для данного набора входных аргументов, кэшируются, поэтому дорогая функция может вызываться только один раз, а последующие вызовы разрешаются в кеше.
Наконец, рассмотрите возможность поднять инварианты из циклов. Для больших многомерных структур это может сэкономить много времени - фактически в этом случае, я бы сказал, что эта оптимизация улучшает читаемость , поскольку она часто служит для того, чтобы прояснить, что некоторое выражение может быть вычислено в измерение высокого уровня во вложенной логике.
(Кстати, это действительно то, что вы имели в виду?
• В операторе if с условием или всегда ставить условие, вероятнее всего, не выполненное первым, поэтому второе проверяться не будет.
Мне следует подумать, что это может иметь место для «и», но «или» замкнет накоротко, если первое значение равно True, сохраняя оценку второго слагаемого условия. Поэтому я бы изменил это правило оптимизации на:
- Если вы проверяете "A и B", сначала ставьте A, если
более вероятно, чтобы оценить
Ложные.
- Если проверяется "A или B", сначала ставьте A, если
это более вероятно, чтобы оценить
Правда.
Но часто последовательность условий определяется самими тестами:
if obj is not None and hasattr(obj,"name") and obj.name.startswith("X"):
Вы не можете переупорядочить их для оптимизации - они имеют в этом порядке (или просто позволяют исключениям вылетать и ловить их позже:
if obj.name.startswith("X"):