Это не так красиво, но если скорость важна простой список подстановки побоищ math
:
def quarter(month, quarters=[None, 1, 1, 1, 4, 4, 4,
7, 7, 7, 10, 10, 10]):
"""Return the first month of the quarter for a given month."""
return quarters[month]
timeit
сравнение предполагает, что это примерно в два раза быстрее, чем математический подход TigerhawkT3.
тест сценарий:
import math
def quarter(month, quarters=[None, 1, 1, 1, 4, 4, 4,
7, 7, 7, 10, 10, 10]):
"""Return the first month of the quarter for a given month."""
return quarters[month]
def firstMonthInQuarter1(month):
return (month - 1) // 3 * 3 + 1
def firstMonthInQuarter2(month):
return month - (month - 1) % 3
def first_month_quarter(month):
return int(math.ceil(month/3.)) * 3 - 2
if __name__ == '__main__':
from timeit import timeit
methods = ['quarter', 'firstMonthInQuarter1', 'firstMonthInQuarter2',
'first_month_quarter']
setup = 'from __main__ import {}'.format(','.join(methods))
results = {method: timeit('[{}(x) for x in range(1, 13)]'.format(method),
setup=setup)
for method in methods}
for method in methods:
print '{}:\t{}'.format(method, results[method])
Результаты:
quarter: 3.01457574242
firstMonthInQuarter1: 4.51578357209
firstMonthInQuarter2: 4.01768559763
first_month_quarter: 8.08281871176
Недобросовестный, это будет полезно для тех, кто с подобным вопросом в будущем. Мне жаль, что я не мог найти этот ответ сам, пытаясь решить эту проблему. Политика SO отлично справляется с собственными ответами: http://stackoverflow.com/help/self-answer. –
Сколько людей, по вашему мнению, будет иметь «аналогичный вопрос» *, но не сможет его тривиально решить? Кроме того, это не несправедливо - это не служба написания кода для ** никого **. Политика SO отлично сочетается с хорошими ответами ** на вопросы по теме **, это не значит, что вы можете публиковать все, что захотите. – jonrsharpe
@jonrsharpe: OP также является первым ответчиком. – unutbu