Побудова бібліотек для Python у мові програмування C
Постановка задачі
Мова Python
Numpy
Розширення с
Загальна схема розширень NumPy
Кожне розширення C матиме таку форму
алгоритм для написання власної функції для перетасування елементів масиву.
Упаковка модуля розширення Python C
Створення модуля
Аналіз результатів
Аналіз результатів
Висновки
Дякую за увагу!)
18.90M
Category: programmingprogramming

Побудова бібліотек для Python у мові програмування C

1. Побудова бібліотек для Python у мові програмування C

ПОБУДОВА БІБЛІОТЕК ДЛЯ PYTHON У
МОВІ ПРОГРАМУВАННЯ C
ДИПЛОМНА РОБОТА НЕТРЕБИ АНАСТАСІЇ

2. Постановка задачі

ПОСТАНОВКА ЗАДАЧІ
• Дана дипломна робота присвячена дослідженню
взаємозв’язку між мовами С та Python .
• Метою роботи є аналіз способу побудови бібліотек для Python
на C. На прикладі розширення для NumPy для функції
random.shuffle(), яка обробляє n-мірні масиви й перемішує
елементи в ньому, оптимізації роботи стандартної функції та
розширення її можливостей.
• Також в роботі буде висвітлено, яким чином можна
передавати змінні(об’єкти) Python та масиви NumPy до коду С
та як повертати їх в інтерпретатоp Python та в ній буде
розписано основні та найшвидші алгоритми для генерації
випадкових чисел та їх історію.

3. Мова Python

МОВА PYTHON
• Python— інтерпретована об'єктно-орієнтована мова програмування
високого рівня зі строгою динамічною типізацією.
• Розроблена в 1990 році Гвідо ван Россумом.
• Назва походить від популярної гумористичної передачі Monty Python’s Flying
Circus
• Інтерпретатор мови Python може бути розширений функціями та типами
даних, розробленими на C чи C++ (або на іншій мові, яку можна викликати із
C).

4. Numpy

NUMPY
• Numpy — розширення мови Python, що додає підтримку великих
багатовимірних масивів і матриць, разом з великою бібліотекою
високорівневих математичних функцій для операцій з цими масивами.
• Попередник NumPy, Numeric, був спочатку створений Jim Hugunin.
NumPy — відкрите програмне забезпечення і має багато розробників.
• Розширення написане на Python, Си та Фортран.

5. Розширення с

РОЗШИРЕННЯ С
• Розширення C - це код C, який можна компілювати та
зв’язати із спільною бібліотекою, яку можна
імпортувати, як будь-який модуль Python, і ви можете
викликати вказані підпрограми C так, як вони були
функціями Python.

6. Загальна схема розширень NumPy

ЗАГАЛЬНА СХЕМА РОЗШИРЕНЬ NUMPY
Три речі, які необхідно зробити перед функціями розширення C у
вихідному файлі C:
• Потрібно включити заголовки Python та NumPy.
• Кожне розширення має бути названо у визначальній структурі на початку
файлу. Це ім'я, яке використовується для доступу до розширення з функції
Python.
• Далі робиться набір ініціалізації викликів для налаштування викликів і
інтерфейсу Python та NumPy. Це буде однаково для всіх розширень, що
включають NumPy та Python. Таким чином, виклики init можна скопіювати
у кожен файл розширення.

7. Кожне розширення C матиме таку форму

КОЖНЕ РОЗШИРЕННЯ 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 C
Перш ніж імпортувати новий
модуль, спершу потрібно його
скласти. Це можна зробити,
використовуючи пакет Python
distutils.
Знадобиться файл, викликаний
setup.py для встановлення
програми. setup.py файл для модуля
виглядає так:

12. Створення модуля

СТВОРЕННЯ МОДУЛЯ
Тепер, коли є setup.py файл, можна використовувати його для створення модуля розширення
Python C. Краще використовувати віртуальне середовище, щоб уникнути конфліктів із
середовищем Python.
Потрібно перейти до папки в терміналі, що містить setup.py та запустити таку команду:
$ python3 setup.py install
Ця команда буде компілювати та встановлювати модуль розширення Python C у поточному
каталозі.
Далі можна створювати python file та імпортувати його як стандартний, або ж робити це в
інтерпретаторі.

13. Аналіз результатів

АНАЛІЗ РЕЗУЛЬТАТІВ
Функція
Одномірний масив
100000 елементів
my_shuffle()
Numpy.random.shu
ffle()
1000000 елементів
100000000
елементів
0,0004480600357 0,003726482391357 0,049111056327819
055664
422
824
0,0040812492370 0,040742635726928 0.680793523788452
60547
71
1
Порівняння
швидкодії
9,10
10,93
13,86

14. Аналіз результатів

АНАЛІЗ РЕЗУЛЬТАТІВ
Час виконання
Функція
my_shuffle()
100000 елементів
Одномірний
масив
0,00038391113281 0,004413676261901 0,056118822097778
25
8555
32
1000000 елементів
10000000 елементів
Двомірний масив 0,00052853202819 0,006820590019226 0,086388854980468
82422
074
75
Порівняння
швидкодії
1,37
1,54
1,53

15. Висновки

ВИСНОВКИ
Метою роботи було проектування архітектури та аналіз існуючих способів побудови бібліотек
для Python на C.
В першу чергу була розглянута проблема побудови архітектури модуля на C для Python:
основні методи, функції згортки, ініціалізації, структури типу Py {Name} Object. Також в роботі
було досліджено, яким чином можна передавати об’єкти Python до коду С та як повертати їх в
інтерпретатоp Python.
Розглянуто основні алгоритми для генерації псевдовипадкових чисел. Алгоритм Фішера-Єтса та
різні його інтерпретації, за допомогою яких була написана основна функція в модулі.
Проведено аналіз порівняння швидкості роботи реалізованої функції та стандартної. Також
порівняння швидкостей в роботі на різномірних масивах. Дослідження показало, що написана
функція в деяких випадках прискорюється більш ніж в 20 разів в порівнянні зі стандартною. Це
говорить про те, що написання розширень на С для Python є досить доцільним.
Мету було досягнуто. В результаті роботи було реалізоване розширення, яке пришвидшує
роботу стандартної функції та дає можливість тасування елементів n-мірних масивів.
Реалізовану програмну систему можна використовувати для оптимізації швидкості роботи.

16. Дякую за увагу!)

ДЯКУЮ ЗА УВАГУ!)
English     Русский Rules