Вопрос по python – Есть ли более быстрый способ суммировать арифметическую последовательность чисел в Python?

0
total = 0
for i in range(0, some upper bound):
    total += i

Извините, если это просто, но у меня их много, и они занимают больше места, чем это удобно.

Короче и быстрее в идеале! Есть ли компромисс? MyNameIsKhan
Да, решение сsum является более читабельным иGauss функция быстрее. schlamar
Вы хотите более быстрый или короткий код? dbf

Ваш Ответ

3   ответа
2

total = some_upper_bound * (some_upper_bound -1) / 2

еслиlower_bound != 0:

total = (some_upper_bound - lower_bound) * (some_upper_bound + lower_bound - 1) / 2

Update: Я бы удалил свой ответ, поскольку он является практически точной копией части принятого ответа (хотя я отвечал независимо). Однако есть одно - очень маленькое, но теоретически интересное улучшение, когдаlower_bound участвует: мой ответ содержит только два умножения / деления (которые относительно дороже, чем сложения / вычитания), в то время как другой ответ содержит четыре.

15
total = sum(range(upper))

или же

total = upper * (upper - 1) / 2

Первый - это Питон, второй - Гаусс.

РЕДАКТИРОВАТЬ: Когда не начинается с нуля:

total = sum(range(lower, upper))

или, опять же по Гауссу, сделать то же самое сupper и вычесть то же самое дляlower:

total = upper * (upper - 1) / 2 - lower * (lower - 1) / 2

Если вы используете Python 2.x, замените всеrange сxrange.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededwiki.python.org/moin/PythonSpeed/…
Error: User Rate Limit Exceeded MyNameIsKhan
Error: User Rate Limit ExceededxrangeError: User Rate Limit Exceededrange.
Error: User Rate Limit Exceeded MyNameIsKhan
0

Чтобы расширить на eumiro. Вы можете написать метод, который инкапсулирует метод Гаусса для ясности. Я хотел бы предложить что-то вроде этого (написано на Groovy, потому что я не знаю синтаксис Python):

public int sumUpToBoundary(def upper_bound){
    return (upper_bound) * (upper_bound - 1) / 2;
}

public int sumBetween(def lower_bound, def upper_bound){
    return sumUpToBoundary(upper_bound) - sumUpToBoundary(lower_bound);
}

public void someOtherMethod() {
    int total = sumUpToBoundary(some_upper_bound);
    int total2 = sumBetween(some_lower_bound, some_upper_bound);
}

ОБНОВЛЕНИЕ: @mspy отметил, что подписи моего метода были не в стиле Python. Я обновил пример до groovy, который поддерживает несколько более похожий на Python синтаксис.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы