import numpy as np
import scipy.stats as sps
Нумерация задач должна быть такая же, как в листах с условиями.
Присылать нужно сами файлы ipynb и pdf. В следующий раз решения в архивах или в ссылках проверятся не будут.
Очень желательно присылать все одним письмом.
Важна правильная тема письма: "[499] Иванов Иван, задание 2". Номер группы в квадратных скобках! В следующий раз работа может быть не проверена, если тема будет неправильной.
Дедлайны строгие, решения, присланные после дедлайна, не проверяются.
В решении важно не наличие кода, а полученные результаты. В следующий раз за код без результатов может быть поставлено 0 баллов.
Если есть вопросы, присылайте их на почту с темой "[Вопрос] кококо".
Если есть проблены с созданием pdf, попробуйте Яндекс.Браузер, под Ubuntu он тоже есть https://browser.yandex.ru/desktop/.
Ваше решение это не программа, а небольшое исследование.
Не нужно помещать код в одну ячейку, да еще и делать так, чтобы он вывод печатал.
Ячейки должны быть небольшими, в каждой ячейке не более одного логического этапа решения. Отдельные логические этапы стоит выносить в отдельные функции. Если нужно написать кучу небольших функций, к которым можно дать одно понятное описание, то эти функции стоит поместить в одну ячейку.
В коде должны быть комментарии только по коду. Остальные комментарии должны быть в ячейках Markdown.
Старайтесь рисовать информатиные графики. Если функция принимает маленькие значения, и только в нескольких точках большие, то стоит ограничить масштаб. Если нужно по графикам сделать сравнение, то их нужно рисовать на одном графике.
Комментарии
# На отдельной строке
blablabla = kokoko + krya # На строке с кодом --- два пробела, символ #, один пробел
Имена переменных, функций с маленькой буквы. Классы можно с заглавной.
good_name = True # Так можно
badName = False # Так не стоит
Правильно выставляйте отступы при переносе больших строк
# Так правильно
variable_name = long_function_name(first_long_variable_name, second_long_long_variable_name,
third_variable_name, another_variable)
# Так не правильно
variable_name = long_function_name(first_long_variable_name, second_long_long_variable_name,
third_variable_name, another_variable)
# Так не правильно
variable_name = long_function_name(first_long_variable_name, second_long_long_variable_name, third_variable_name, another_variable)
# Так правильно
variable_name = long_function_name(first_long_variable_name) + function_name(second_variable_name) \
+ third_variable_name + another_variable
# Так не правильно
variable_name = long_function_name(first_long_variable_name) + function_name(second_variable_name) \
+ third_variable_name + another_variable
# Так не правильно
variable_name = long_function_name(first_long_variable_name) + function_name(second_variable_name) + third_variable_name + another_variable
Вокруг знаков присваивания и знаков арифметических операций ставятся пробелы. Исключения --- именованные параметры функций.
def function_name(first_variable, second_variable=0):
return first_variable + second_variable
variable_name = function_name(100, second_variable=30)
Посмотрим на простой пример --- сумма первых $10^8$ чисел.
Простой код
%%time
sum_value = 0
for i in range(10 ** 8):
sum_value += i
print(sum_value)
4999999950000000 CPU times: user 22.2 s, sys: 2.21 ms, total: 22.2 s Wall time: 22.2 s
Немного улучшеный код
%%time
sum_value = sum(range(10 ** 8))
print(sum_value)
4999999950000000 CPU times: user 3.07 s, sys: 4.01 ms, total: 3.07 s Wall time: 3.06 s
Код с использованием функций библиотеки numpy
%%time
sum_value = np.arange(10 ** 8).sum()
print(sum_value)
4999999950000000 CPU times: user 250 ms, sys: 457 ms, total: 708 ms Wall time: 732 ms
Простой и понятный код работает в $30$ раз быстрее!
Посмотрим на другой пример. Сгенерируем матрицу размера $500x1000$, и вычислим средний минимум по колонкам.
Простой код, но при этом даже использующий некоторые питон-функции
%%time
N, M = 500, 1000
matrix = []
for i in range(N):
matrix.append([sps.uniform.rvs() for j in range(M)])
min_col = [min([matrix[i][j] for i in range(N)]) for j in range(M)]
mean_min = sum(min_col) / N
print(mean_min)
0.0038593818799163475 CPU times: user 21.7 s, sys: 15.5 ms, total: 21.7 s Wall time: 21.7 s
Понятный код с использованием функций библиотеки numpy
%%time
N, M = 500, 1000
matrix = sps.uniform.rvs(size=(N, M))
mean_min = matrix.min(axis=1).mean()
print(mean_min)
0.000993990241709 CPU times: user 24.3 ms, sys: 4.01 ms, total: 28.3 ms Wall time: 51.3 ms
Простой и понятный код работает в $400$ раз быстрее!
А почему? Внтури функций из numpy используется код на языке C.