- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему Python?
- •План книги
- •Версия Python, платформа и IDE
- •Установка Python
- •Запуск Python
- •Использование виртуальной среды
- •Вперед!
- •Глава 1. Спасение моряков с помощью теоремы Байеса
- •Теорема Байеса
- •Проект #1. Поиск и спасение
- •Стратегия
- •Установка библиотек Python
- •Код для теоремы Байеса
- •Время сыграть
- •Итоги
- •Дополнительная литература
- •Усложняем проект. Более грамотный поиск
- •Усложняем проект. Поиск лучшей стратегии с помощью MCS
- •Усложняем проект. Вычисление вероятности обнаружения
- •Глава 2. Установление авторства с помощью стилометрии
- •Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир»
- •Стратегия
- •Установка NLTK
- •Корпусы текстов
- •Код стилометрии
- •Итоги
- •Дополнительная литература
- •Практический проект: охота на собаку Баскервилей с помощью распределения
- •Практический проект: тепловая карта пунктуации
- •Усложняем проект: фиксирование частотности
- •Глава 3. Суммаризация текста с помощью обработки естественного языка
- •Стратегия
- •Веб-скрапинг
- •Код для «У меня есть мечта»
- •Установка gensim
- •Код для суммаризации речи «Заправляйте свою кровать»
- •Проект #5. Суммаризация речи с помощью облака слов
- •Модули Word Cloud и PIL
- •Код для создания облака слов
- •Итоги
- •Дополнительная литература
- •Усложняем проект: ночные игры
- •Усложняем проект: суммаризация суммаризаций
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Одноразовый блокнот
- •Шифр «Ребекка»
- •Проект #6. Цифровой ключ к «Ребекке»
- •Стратегия
- •Код для шифрования
- •Отправка сообщений
- •Итоги
- •Дополнительная литература
- •Глава 5. Поиск Плутона
- •Проект #7. Воссоздание блинк-компаратора
- •Стратегия
- •Данные
- •Код блинк-компаратора
- •Использование блинк-компаратора
- •Проект #8. Обнаружение астрономических транзиентов путем дифференцирования изображений
- •Стратегия
- •Код для детектора транзиентов
- •Использование детектора транзиентов
- •Итоги
- •Дополнительная литература
- •Практический проект: представление орбитальной траектории
- •Практический проект: найди отличия
- •Усложняем проект: сосчитаем звезды
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Цель миссии «Аполлон-8»
- •Траектория свободного возврата
- •Задача трех тел
- •Проект #9. На Луну с «Аполлоном-8»!
- •Использование модуля turtle
- •Стратегия
- •Код программы для расчета свободного возврата «Аполлона-8»
- •Выполнение симуляции
- •Итоги
- •Дополнительная литература
- •Практический проект: симуляция шаблона поисков
- •Практический проект: запусти меня!
- •Практический проект: останови меня!
- •Усложняем проект: симуляция в истинном масштабе
- •Усложняем проект: реальный «Аполлон-8»
- •Глава 7. Выбор мест высадки на Марсе
- •Посадка на Марс
- •Карта MOLA
- •Проект #10. Выбор посадочных мест на Марсе
- •Стратегия
- •Код для выбора мест посадки
- •Результаты
- •Итоги
- •Дополнительная литература
- •Практический проект: убедимся, что рисунки становятся частью изображения
- •Практический проект: визуализация профиля высот
- •Практический проект: отображение в 3D
- •Практический проект: совмещение карт
- •Усложняем проект: три в одном
- •Усложняем проект: перенос прямоугольников
- •Глава 8. Обнаружение далеких экзопланет
- •Транзитная фотометрия
- •Проект #11. Симуляция транзита экзопланеты
- •Стратегия
- •Код для транзита
- •Эксперименты с транзитной фотометрией
- •Проект #12. Получение изображений экзопланет
- •Стратегия
- •Код для пикселизатора
- •Итоги
- •Дополнительная литература
- •Практический проект: обнаружение инопланетных мегаструктур
- •Практический проект: обнаружение транзита астероидов
- •Практический проект: добавление эффекта потемнения к краю
- •Практический проект: обнаружение пятен на звездах
- •Практический проект: обнаружение инопланетной армады
- •Практический проект: обнаружение планеты с луной
- •Практический проект: измерение продолжительности экзопланетного дня
- •Усложняем проект: генерация динамической кривой блеска
- •Глава 9. Как различить своих и чужих
- •Обнаружение лиц на фотографиях
- •Проект #13. Программирование робота-часового
- •Стратегия
- •Результаты
- •Обнаружение лиц в видеопотоке
- •Итоги
- •Дополнительная литература
- •Практический проект: размытие лиц
- •Усложняем проект: обнаружение кошачьих мордочек
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Распознавание лиц с помощью LBPH
- •Схема распознавания лиц
- •Извлечение гистограмм локальных бинарных шаблонов
- •Проект #14. Ограничение доступа к инопланетному артефакту
- •Стратегия
- •Поддержка модулей и файлов
- •Код для захвата видео
- •Код для обучения алгоритма распознавания лиц
- •Код для прогнозирования лиц
- •Результаты
- •Итоги
- •Дополнительная литература
- •Усложняем проект: добавление пароля и видеозахвата
- •Усложняем проект: похожие лица и близнецы
- •Усложняем проект: машина времени
- •Глава 11. Создание интерактивной карты побега от зомби
- •Проект #15. Визуализация плотности населения с помощью хороплетной карты
- •Стратегия
- •Библиотека анализа данных
- •Библиотеки bokeh и holoviews
- •Установка pandas, bokeh и holoviews
- •Работа с данными по уровню безработицы и плотности населения в округах и штатах
- •Разбираем код holoviews
- •Код для отрисовки хороплетной карты
- •Планирование маршрута
- •Итоги
- •Дополнительная литература
- •Усложняем проект: отображение на карте изменения численности населения США
- •Глава 12. Находимся ли мы в компьютерной симуляции?
- •Проект #16. Жизнь, Вселенная и пруд черепахи Йертл
- •Код симуляции пруда
- •Следствия симуляции пруда
- •Измерение затрат на пересечение строк или столбцов сетки
- •Результаты
- •Стратегия
- •Итоги
- •Дополнительная литература
- •Дополнение
- •Усложняем проект: поиск безопасного места в космосе
- •Усложняем проект: а вот и Солнце
- •Усложняем проект: взгляд глазами собаки
- •Усложняем проект: кастомизированный поиск слов
- •Усложняем проект: что за сложную паутину мы плетем
- •Усложняем проект: идем вещать с горы
- •Решения для практических проектов
- •Глава 2. Определение авторства с помощью стилометрии
- •Охота на собаку Баскервилей с помощью распределения
- •Тепловая карта пунктуации
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Составление графика символов
- •Отправка секретов шифром времен Второй мировой войны
- •Глава 5. Поиск Плутона
- •Представление орбитальной траектории
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Симуляция шаблона поисков
- •Заведи меня!
- •Останови меня!
- •Глава 7. Выбор мест высадки на Марсе
- •Убеждаемся, что рисунки становятся частью изображения
- •Визуализация профиля высоты
- •Отображение в 3D
- •Совмещение карт
- •Глава 8. Обнаружение далеких экзопланет
- •Обнаружение инопланетных мегаструктур
- •Обнаружение транзита астероидов
- •Добавление эффекта потемнения к краю
- •Обнаружение инопланетной армады
- •Обнаружение планеты с луной
- •Измерение продолжительности экзопланетного дня
- •Глава 9. Как различить своих и чужих
- •Размытие лиц
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
344 Глава 12. Находимся ли мы в компьютерной симуляции?
Помимо ограничения размера объектов, сетка в симуляции может определять предпочтительную ориентацию, или анизотропию, материи космоса. Анизотропия характеризует различие свойств среды в зависимости от направления. Например, дерево проще расколоть вдоль волокон, чем поперек. Если внимательно посмотреть на траектории движения Йертл в симуляции (рис. 12.3), то мы увидим признаки анизотропии. Верхняя, слегка наклонная траектория неровная, а нижняя — с запада на восток — идеально прямая.
Рис. 12.3.
Траектории движения черепахи
Изображение неортогональной линии на ортогональной сетке выглядит некрасиво. Но здесь дело не только в эстетике. Перемещение вдоль x или y требует прибавления или вычитания только целых значений (рис. 12.4, слева). Перемещение под углом требует тригонометрического вычисления частичного смещения в направлениях x и y (рис. 12.4, справа).
Для компьютера математические вычисления равносильны работе, то есть можно заключить, что движение под углом требует больше энергии. Замерив время вычислений для двух траекторий на рис. 12.4, мы можем получить разницу в затраченной энергии.
1 + 1 + 1 + 1 + . . . |
Ѳ |
а
П
С
Рис. 12.4. Перемещение вдоль строк или столбцов (слева) требует более простых арифметических вычислений, чем перемещение с пересечением строки
или столбца (справа)
Измерение затрат на пересечение строк или столбцов сетки
Чтобы вычислить разницу во времени при рисовании линии вдоль строки или столбца и линии, пересекающей их, необходимо нарисовать две линии одинаковой длины. Но при этом нужно помнить, что turtle работает только с целыми
Проект #16. Жизнь, Вселенная и пруд черепахи Йертл 345
числами. Придется найти угол, для которого все стороны треугольника — катеты и гипотенуза на рис. 12.4 — будут представлены целыми числами. Так мы будем знать, что наклонная линия имеет ту же длину, что и прямая.
Для нахождения этих углов можно использовать пифагорову тройку, набор положительных целых чисел a, b и с, которые удовлетворяют квадратному уравнению a2 + b2 = c2. Известна тройка 3-4-5, но нам может потребоваться более длинная линия, чтобы время, затраченное на рисование линии, не оказалось меньше точности измерения часов компьютера. Удобно, что другие тройки значений можно также найти онлайн. Неплохим вариантом будет, например, сочетание 62-960-962, так как линия получится достаточно длинной и при этом поместится на экране turtle.
Код для сравнения линий
Для рисования диагональной и прямой линий мы воспользуемся turtle (листинг 12.3). Первую линию мы рисуем параллельно оси x (то есть запад-восток), а вторую под небольшим углом к ней. Верный угол можно вычислить с помощью тригонометрии; в данном случае это 3.695220532 градуса. Код многократно повторяет цикл for и записывает время, затраченное на каждую линию, используя модуль time. В итоге сравнивается среднее время для обеих линий.
Средние мы берем, потому что CPU компьютера непрерывно обрабатывает множество процессов. Операционная система планирует эти процессы внутренне, выполняя один и откладывая другой, пока ресурс ввода/вывода не станет доступен. Следовательно, сложно зарегистрировать абсолютное время выполнения заданной функции. Вычисление среднего значения времени для множества выполнений учитывает это обстоятельство.
Код, line_compare.py, можно скачать с сайта книги.
Листинг 12.3. Отрисовка прямой и наклонной линий и регистрация затраченного на каждую линию времени
line_compare.py
from time import perf_counter import statistics
import turtle
turtle.setup(1200, 600) screen = turtle.Screen()
ANGLES = (0, 3.695220532) # В градусах
NUM_RUNS = 20 SPEED = 0
for angle in ANGLES:times = []
346 Глава 12. Находимся ли мы в компьютерной симуляции?
for _ in range(NUM_RUNS): line = turtle.Turtle() line.speed(SPEED) line.hideturtle() line.penup() line.lt(angle) line.setpos(-470, 0) line.pendown() line.showturtle()
start_time = perf_counter() line.fd(962)
end_time = perf_counter() times.append(end_time - start_time)
line_ave = statistics.mean(times)
print("Angle {} degrees: average time for {} runs at speed {} = {:.5f}"
.format(angle, NUM_RUNS, SPEED, line_ave))
Начинаем с импорта счетчика производительности perf_counter из модуля time. Эта функция возвращает время в секундах в виде значения с плавающей точкой. При этом ответ она дает более точный, чем time.clock(), которую заменила, начиная с Python 3.8.
Далее импортируем модуль statistics, с помощью которого вычислим среднее значение по множеству запусков симуляции. После импортируем turtle и настраиваем turtle screen. Вы можете подстроить экран под свой монитор, но помните, что у вас должна быть возможность видеть линию длиной 962 пикселя.
Теперь присваиваем значения ключей для симуляции. Помещаем углы для прямой и наклонной линий в кортеж ANGLES, после чего присваиваем переменную для хранения числа циклов for и скорости отрисовки линии.
Начинаем перебор углов в кортеже ANGLES. Создаем пустой список для хранения измеренных значений времени , после чего настраиваем объект turtle, как делали это ранее. Поворачиваем объект turtle влево на значение angle и с помощью setpos() перемещаем его к левому краю экрана.
Перемещаем указатель-черепаху вперед на 962 пикселя, вписывая команду между вызовами perf_counter(), чтобы замерить время этого перемещения . Вычитаем итоговое время из начального и заносим результат в список times.
Завершаем процесс, используя функцию statistics.mean() для вычисления среднего времени отрисовки каждой линии. Выводим результат с точностью до пяти десятичных знаков. После выполнения программы результат должен выглядеть, как на рис. 12.5.
Так как мы использовали пифагорову тройку, наклонная линия действительно завершается в пикселе, а не просто привязывается к ближайшему из них. Это
Проект #16. Жизнь, Вселенная и пруд черепахи Йертл 347
гарантирует одинаковую длину обеих линий и точность сравнения времени их отрисовки.
Рис. 12.5. Результирующее изображение на экране turtle для line_compare.py
Результаты
Если вы нарисуете каждую линию 500 раз и сравните результаты, то увидите, что на наклонную линию тратится примерно в 2.4 раза больше времени.
Angle 0 degrees: average time for 500 runs at speed 0 = 0.06492
Angle 3.695220532 degrees: average time for 500 runs at speed 0 = 0.15691
У вас значения времени наверняка будут немного отличаться, поскольку на скорость выполнения влияют и другие программы, параллельно выполняемые на вашем компьютере. Как я уже отмечал, всеми этими процессами руководит планировщик задач CPU, обеспечивая быстродействие системы, а также эффективность и равномерность распределения ее ресурсов.
Если повторить эксперимент 1000 раз, то результаты должны оказаться такими же. (Если решите это проделать, то не забудьте прежде запастись чашечкой кофе и вкусностями.) Наклонная линия требует примерно в 2.7 раза больше времени.
Angle 0 degrees: average time for 1000 runs at speed 0 = 0.10911
Angle 3.695220532 degrees: average time for 1000 runs at speed 0 = 0.29681
Здесь мы выполняли короткую функцию с высокой скоростью отрисовки. Если вас беспокоит тот факт, что turtle с целью повышения скорости выполняет оптимизацию, пренебрегая точностью, то можете уменьшить значение скорости и выполнить программу еще раз. При установке значения speed = 6 на рисование