Сумма введённых элементов массива

Как найти сумму всех элементов одномерного массива, значения которых ввел пользователь в питоне 3.x?


Ответы (2 шт):

Автор решения: Zhihar

с помощью функции sum()

функция на вход принимает итерируемый объект, например список list

пользователь может ввести символы в одной строке и тогда эту строку надо разбить на слова, слова преобразовать в список чисел и вычислить сумму этих чисел

пример кода:

print(sum(map(int, input().split())))

пользователь может ввести последовательно одно за другим n чисел и тогда надо все что он вводить оформить в виде списка и вычислить сумму по этому списку

пример кода:

print(sum(int(input()) for _ in range(n)))
→ Ссылка
Автор решения: Serg Bocharov

Есть разные способы, но предложенный Zhihar самый быстрый. Для себя заморочился, просмотреть на время выполнения. Заполняем список из 1 000 000 элементов случайными значениями в диапазоне от 2^64 до 2^65, а затем прогоняем через 4 разных способа по 100 раз:

EDITED Вынес просчет длины массива за циклы по подсказке CrazyElf (отдельное спасибо), while немного реабилитировался, но позиции в рейтинге не поменялись и добавил Numpy;)

EDITED 2 Спасибо за комментарий extrn, реальное повышение быстродействия:

import operator
import time
import numpy as np
from functools import reduce
from random import randint

lst = [randint(2**64, 2**65) for _ in range(1000000)]
length = len(lst)
np_lst = np.array(lst)


def time_decorator(function):
    def accepting_args(*args):
        start_time = time.time()
        for i in range(100):
            function(*args)
        print(f"--- {function.__name__} takes {(time.time() - start_time)} seconds ---")
    return accepting_args


@time_decorator
def sum_list(data):
    return sum(data)


@time_decorator
def for_list(data):
    total = 0
    for ele in data:
        total += ele
    return total


@time_decorator
def reduce_list(data):
    return reduce(operator.add, data)


@time_decorator
def while_list(data, length):
    total = 0
    ele = 0
    while ele < length:
        total = total + data[ele]
        ele += 1
    return total


@time_decorator
def np_array(np_lst):
    return np.sum(np_lst)


sum_list(lst)
for_list(lst)
reduce_list(lst)
while_list(lst, length)
np_array(np_lst)

Результаты старых замеров:

--- sum_list takes 2.1900558471679688 seconds ---
--- for_list takes 5.327928066253662 seconds ---
--- reduce_list takes 9.168933391571045 seconds ---
--- while_list takes 9.949931144714355 seconds ---
--- np_array takes 0.0734705924987793 seconds ---

Результаты после изменений предложенных extrn:

--- sum_list takes 2.176893711090088 seconds ---
--- for_list takes 3.3837478160858154 seconds ---
--- reduce_list takes 3.482226610183716 seconds ---
--- while_list takes 10.27085542678833 seconds ---
--- np_array takes 2.422048568725586 seconds ---

Т.е. очевидно, что использование sum самый быстрый вариант (где-то рядом numpy). На втором месте перебор в цикле for, на третьем использование reduce, и, внезапно :), самый "грустный" цикл while

→ Ссылка