{ "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 }