Слайд 2ПОСТАНОВКА ЗАДАЧІ
Дана дипломна робота присвячена дослідженню взаємозв’язку між мовами С та Python .
Метою
роботи є аналіз способу побудови бібліотек для Python на C. На прикладі розширення для NumPy для функції random.shuffle(), яка обробляє n-мірні масиви й перемішує елементи в ньому, оптимізації роботи стандартної функції та розширення її можливостей.
Також в роботі буде висвітлено, яким чином можна передавати змінні(об’єкти) Python та масиви NumPy до коду С та як повертати їх в інтерпретатоp Python та в ній буде розписано основні та найшвидші алгоритми для генерації випадкових чисел та їх історію.
Слайд 3МОВА PYTHON
Python— інтерпретована об'єктно-орієнтована мова програмування високого рівня зі строгою динамічною типізацією.
Розроблена
в 1990 році Гвідо ван Россумом.
Назва походить від популярної гумористичної передачі Monty Python’s Flying Circus
Інтерпретатор мови Python може бути розширений функціями та типами даних, розробленими на C чи C++ (або на іншій мові, яку можна викликати із C).
Слайд 4NUMPY
Numpy — розширення мови Python, що додає підтримку великих багатовимірних масивів і матриць,
разом з великою бібліотекою високорівневих математичних функцій для операцій з цими масивами.
Попередник NumPy, Numeric, був спочатку створений Jim Hugunin. NumPy — відкрите програмне забезпечення і має багато розробників.
Розширення написане на Python, Си та Фортран.
Слайд 5РОЗШИРЕННЯ С
Розширення C - це код C, який можна компілювати та зв’язати із
спільною бібліотекою, яку можна імпортувати, як будь-який модуль Python, і ви можете викликати вказані підпрограми C так, як вони були функціями Python.
Слайд 6ЗАГАЛЬНА СХЕМА РОЗШИРЕНЬ NUMPY
Три речі, які необхідно зробити перед функціями розширення C
у вихідному файлі C:
Потрібно включити заголовки Python та NumPy.
Кожне розширення має бути названо у визначальній структурі на початку файлу. Це ім'я, яке використовується для доступу до розширення з функції Python.
Далі робиться набір ініціалізації викликів для налаштування викликів і інтерфейсу Python та NumPy. Це буде однаково для всіх розширень, що включають NumPy та Python. Таким чином, виклики init можна скопіювати у кожен файл розширення.
Слайд 7КОЖНЕ РОЗШИРЕННЯ C МАТИМЕ ТАКУ ФОРМУ
Аргументи завжди будуть однаковими: (PyObject *self, PyObject *args).
Вони вказують на загальні об'єкти Python, і вони автоматично надаються файлами заголовків, які потрібні для використання об’єктів з NumPy та самого Python.
Аргументи обробляються за допомогою виклику функції, яка аналізує їх і присвоює їм визначені C об'єкти.
Далі результати цього синтаксису можуть бути перевірені програмами утиліти, яка потрапляє в структуру, що представляє об'єкт, і гарантує, що дані мають правильний вид (float або int, 1D або 2D масив тощо).
Слайд 8Після деяких можливих перевірок даних типи даних C ініціалізуються для вказівки на частину
даних масивів NumPy за допомогою функцій утиліт.
Інформація про наступні параметри вилучається, щоб ви знали кількість стовпців, рядків, розміри вектора тощо.
Тепер можна використовувати масиви C для управління даними в масивах NumPy. Дані масивів C та даних C з вищевказаного розбору вказують на вихідні дані Python / NumPy, тому зміни, вносяться, впливають на значення масиву, коли ви повертаєтесь до Python після повернення розширення. Можна передавати масиви іншим функціям C, які виконують обчислення, тощо.
Нарешті, можна повертатися до функції виклику Python, повертаючи значення масиву NumPy.
Слайд 9АЛГОРИТМ ДЛЯ НАПИСАННЯ ВЛАСНОЇ ФУНКЦІЇ ДЛЯ ПЕРЕТАСУВАННЯ ЕЛЕМЕНТІВ МАСИВУ.
Тасування Фішера - Єйтса (названо
на честь Рональда Фішера і Франка Єйтса (Frank Yates)), відоме також під ім'ям тасування Кнута (в честь Дональда Кнута), - це алгоритм створення випадкових перестановок кінцевого безлічі, просто кажучи, для випадкового тасування безлічі.
Слайд 10Реєстрація методів модуля та Визначення модуля
Слайд 11УПАКОВКА МОДУЛЯ РОЗШИРЕННЯ PYTHON C
Перш ніж імпортувати новий модуль, спершу потрібно його скласти.
Це можна зробити, використовуючи пакет Python distutils.
Знадобиться файл, викликаний setup.py для встановлення програми. setup.py файл для модуля виглядає так:
Слайд 12СТВОРЕННЯ МОДУЛЯ
Тепер, коли є setup.py файл, можна використовувати його для створення модуля розширення
Python C. Краще використовувати віртуальне середовище, щоб уникнути конфліктів із середовищем Python.
Потрібно перейти до папки в терміналі, що містить setup.py та запустити таку команду:
$ python3 setup.py install
Ця команда буде компілювати та встановлювати модуль розширення Python C у поточному каталозі.
Далі можна створювати python file та імпортувати його як стандартний, або ж робити це в інтерпретаторі.
Слайд 15ВИСНОВКИ
Метою роботи було проектування архітектури та аналіз існуючих способів побудови бібліотек для Python
на C.
В першу чергу була розглянута проблема побудови архітектури модуля на C для Python: основні методи, функції згортки, ініціалізації, структури типу Py {Name} Object. Також в роботі було досліджено, яким чином можна передавати об’єкти Python до коду С та як повертати їх в інтерпретатоp Python.
Розглянуто основні алгоритми для генерації псевдовипадкових чисел. Алгоритм Фішера-Єтса та різні його інтерпретації, за допомогою яких була написана основна функція в модулі.
Проведено аналіз порівняння швидкості роботи реалізованої функції та стандартної. Також порівняння швидкостей в роботі на різномірних масивах. Дослідження показало, що написана функція в деяких випадках прискорюється більш ніж в 20 разів в порівнянні зі стандартною. Це говорить про те, що написання розширень на С для Python є досить доцільним.
Мету було досягнуто. В результаті роботи було реалізоване розширення, яке пришвидшує роботу стандартної функції та дає можливість тасування елементів n-мірних масивів. Реалізовану програмну систему можна використовувати для оптимізації швидкості роботи.