{
"cells": [
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import scipy.stats as sps"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### ФИВТ МФТИ\n",
"\n",
"#### Курс математической статистики\n",
"\n",
"Никита Волков (email, VK)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Некоторые правила\n",
"\n",
"1. Нумерация задач должна быть **такая же**, как в листах с условиями.\n",
"\n",
"2. Присылать нужно сами файлы **ipynb и pdf**. В следующий раз решения в архивах или в ссылках **проверятся не будут**.\n",
"\n",
"3. Очень желательно присылать все **одним** письмом.\n",
"\n",
"4. Важна правильная тема письма: \"[499] Иванов Иван, задание 2\". Номер группы **в квадратных скобках**! В следующий раз работа может быть не проверена, если тема будет неправильной.\n",
"\n",
"5. Дедлайны строгие, решения, присланные после дедлайна, **не проверяются**.\n",
"\n",
"6. В решении важно не наличие кода, а полученные **результаты**. В следующий раз за код без результатов может быть поставлено **0 баллов**.\n",
"\n",
"7. Если есть вопросы, присылайте их на почту с темой \"[Вопрос] кококо\".\n",
"\n",
"Если есть проблены с созданием pdf, попробуйте Яндекс.Браузер, под Ubuntu он тоже есть https://browser.yandex.ru/desktop/."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Оформление\n",
"\n",
"Ваше решение это не программа, а небольшое **исследование**. \n",
"\n",
"Не нужно помещать код в одну ячейку, да еще и делать так, чтобы он вывод печатал.\n",
"\n",
"Ячейки должны быть небольшими, в каждой ячейке не более одного логического этапа решения.\n",
"Отдельные логические этапы стоит выносить в отдельные функции.\n",
"Если нужно написать кучу небольших функций, к которым можно дать одно понятное описание, то эти функции стоит поместить в одну ячейку.\n",
"\n",
"В коде должны быть комментарии только по коду.\n",
"Остальные комментарии должны быть в ячейках Markdown.\n",
"\n",
"Старайтесь рисовать информатиные графики.\n",
"Если функция принимает маленькие значения, и только в нескольких точках большие, то стоит ограничить масштаб.\n",
"Если нужно по графикам сделать сравнение, то их нужно рисовать на одном графике."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Некоторые правила из Style Guide\n",
"\n",
"Комментарии"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# На отдельной строке\n",
"blablabla = kokoko + krya # На строке с кодом --- два пробела, символ #, один пробел"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Имена переменных, функций **с маленькой** буквы.\n",
"Классы можно с заглавной."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"good_name = True # Так можно\n",
"badName = False # Так не стоит"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Правильно выставляйте **отступы** при переносе больших строк"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Так правильно\n",
"variable_name = long_function_name(first_long_variable_name, second_long_long_variable_name,\n",
" third_variable_name, another_variable)\n",
"\n",
"# Так не правильно\n",
"variable_name = long_function_name(first_long_variable_name, second_long_long_variable_name,\n",
" third_variable_name, another_variable)\n",
"\n",
"# Так не правильно\n",
"variable_name = long_function_name(first_long_variable_name, second_long_long_variable_name, third_variable_name, another_variable)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Так правильно\n",
"variable_name = long_function_name(first_long_variable_name) + function_name(second_variable_name) \\\n",
" + third_variable_name + another_variable\n",
"\n",
"# Так не правильно\n",
"variable_name = long_function_name(first_long_variable_name) + function_name(second_variable_name) \\\n",
" + third_variable_name + another_variable\n",
"\n",
"# Так не правильно\n",
"variable_name = long_function_name(first_long_variable_name) + function_name(second_variable_name) + third_variable_name + another_variable"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Вокруг знаков присваивания и знаков арифметических операций ставятся **пробелы**.\n",
"Исключения --- именованные параметры функций."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def function_name(first_variable, second_variable=0):\n",
" return first_variable + second_variable\n",
"\n",
"variable_name = function_name(100, second_variable=30)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Долго работает? Пишите код правильно!\n",
"\n",
"Посмотрим на простой пример --- сумма первых $10^8$ чисел.\n",
"\n",
"Простой код"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4999999950000000\n",
"CPU times: user 22.2 s, sys: 2.21 ms, total: 22.2 s\n",
"Wall time: 22.2 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"sum_value = 0\n",
"for i in range(10 ** 8):\n",
" sum_value += i\n",
"print(sum_value)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Немного улучшеный код"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4999999950000000\n",
"CPU times: user 3.07 s, sys: 4.01 ms, total: 3.07 s\n",
"Wall time: 3.06 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"sum_value = sum(range(10 ** 8))\n",
"print(sum_value)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Код с использованием функций библиотеки numpy"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4999999950000000\n",
"CPU times: user 250 ms, sys: 457 ms, total: 708 ms\n",
"Wall time: 732 ms\n"
]
}
],
"source": [
"%%time\n",
"\n",
"sum_value = np.arange(10 ** 8).sum()\n",
"print(sum_value)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Простой и понятный код работает в $30$ раз быстрее!\n",
"\n",
"Посмотрим на другой пример.\n",
"Сгенерируем матрицу размера $500x1000$, и вычислим средний минимум по колонкам.\n",
"\n",
"Простой код, но при этом даже использующий некоторые питон-функции"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0038593818799163475\n",
"CPU times: user 21.7 s, sys: 15.5 ms, total: 21.7 s\n",
"Wall time: 21.7 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"N, M = 500, 1000\n",
"matrix = []\n",
"for i in range(N):\n",
" matrix.append([sps.uniform.rvs() for j in range(M)])\n",
"\n",
"min_col = [min([matrix[i][j] for i in range(N)]) for j in range(M)]\n",
"mean_min = sum(min_col) / N\n",
"print(mean_min)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Понятный код с использованием функций библиотеки numpy"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.000993990241709\n",
"CPU times: user 24.3 ms, sys: 4.01 ms, total: 28.3 ms\n",
"Wall time: 51.3 ms\n"
]
}
],
"source": [
"%%time\n",
"\n",
"N, M = 500, 1000\n",
"matrix = sps.uniform.rvs(size=(N, M))\n",
"mean_min = matrix.min(axis=1).mean()\n",
"print(mean_min)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Простой и понятный код работает в $400$ раз быстрее!\n",
"\n",
"А почему? Внтури функций из numpy используется код на языке C."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.4.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}