Сумма введённых элементов массива
Как найти сумму всех элементов одномерного массива, значения которых ввел пользователь в питоне 3.x?
Ответы (2 шт):
с помощью функции sum()
функция на вход принимает итерируемый объект, например список list
пользователь может ввести символы в одной строке и тогда эту строку надо разбить на слова, слова преобразовать в список чисел и вычислить сумму этих чисел
пример кода:
print(sum(map(int, input().split())))
пользователь может ввести последовательно одно за другим n чисел и тогда надо все что он вводить оформить в виде списка и вычислить сумму по этому списку
пример кода:
print(sum(int(input()) for _ in range(n)))
Есть разные способы, но предложенный 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