Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

Продолжая пример с решетом Эратосфена, стоит посмотреть, как тратится процессорное время при вызове функции primes:

Листинг

>>> profile.run(«Sieve.primes(100000)»)

709 function calls in 1.320 CPU seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.010 0.010 1.320 1.320 <string>:1(?)

1 0.140 0.140 1.310 1.310 Sieve.py:13(primes)

1 0.000 0.000 1.320 1.320 profile:0(Sieve.primes(100000))

0 0.000 0.000 profile:0(profiler)

65 0.000 0.000 0.000 0.000 sets.py:119(__iter__)

314 0.000 0.000 0.000 0.000 sets.py:292(__contains__)

65 0.000 0.000 0.000 0.000 sets.py:339(_binary_sanity_check)

66 0.630 0.010 0.630 0.010 sets.py:356(_update)

66 0.000 0.000 0.630 0.010 sets.py:425(__init__)

65 0.010 0.000 0.540 0.008 sets.py:489(__isub__)

65 0.530 0.008 0.530 0.008 sets.py:495(difference_update)

Здесь ncalls —

количество вызовов функции или метода, tottime — полное время выполнения кода функции (без времени нахождения в вызываемых функциях), percall — тоже, в пересчете на один вызов, cumtime — аккумулированное время нахождения в функции, вместе со всеми вызываемыми функциями. В последнем столбце приведено имя файла, номер строки с функцией или методов и его имя.

Примечание:

«Странные» имена, например, __iter__, __contains__ и __isub__ - имена методов, реализующих итерацию по элементам, проверку принадлежности элемента (in) и операцию -=. Метод __init__ - конструктор объекта (в данном случае — множества).

Модуль unittest

При разработке программного обеспечения рекомендуется применять так называемые регрессионные испытания. Для каждого модуля составляется набор тестов, по возможности таким образом, чтобы проверялись не только типичные вычисления, но и «крайние», вырожденные случаи, чтобы испытания затронули каждую ветку алгоритма хотя бы один раз. Тест для данного модуля (написанный сразу после того, как определен интерфейс модуля) находится в файле test_Sieve.py:

Листинг

# file: test_Sieve.py

import Sieve, sets

import unittest

class TestSieve(unittest.TestCase):

def setUp(self):

pass

def testone(self):

primes = Sieve.primes(1)

self.assertEqual(primes, sets.Set)

def test100(self):

primes = Sieve.primes(100)

self.assert_(primes == sets.Set([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,

53, 59, 61, 67, 71, 73, 79, 83, 89, 97]))

if __name__ == '__main__':

unittest.main

Тестовый модуль состоит из определения класса, унаследованного от класса unittest.TestCase, в котором описывается подготовка к испытаниям (метод setUp) и сами испытания — методы, начинающиеся на test. В данном случае таких испытаний всего два: в первом испытывается случай N=1, а во втором — N=100.

Запуск тестов производится выполнением функции unittest.main. Вот как выглядят успешные испытания:

Листинг

$ python test_Sieve.py

..

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

Ran 2 tests in 0.002s

OK

В процессе разработки перед каждым выпуском все модули прогоняются через регрессионные испытания, чтобы обнаружить, не были ли внесены ошибки. Однако никакие

тесты в общем случае не могут гарантировать безошибочности сложной программы. При дополнении модулей тесты также могут быть дополнены, чтобы отразить изменения в проекте.

Кстати, сам Python и его стандартная библиотека имеют тесты для каждого модуля — они находятся в каталоге test в месте, где развернуты файлы поставки Python, и являются частью пакета test.

Модуль pydoc

Успех проекта зависит не только от обеспечения эффективного и качественного кода, но и от качества документации. Утилита pydoc аналогична команде man в Unix:

Листинг

$ pydoc Sieve

Help on module Sieve:

NAME

Sieve — Модуль для вычисления простых чисел от 2 до N

FILE

Sieve.py

FUNCTIONS

primes(N)

Возвращает все простые от 2 до N

Эта страница помощи появилась благодаря тому, что были написаны строки документации — как ко всему модулю, так и к функции primes(N).

Стоит попробовать запустить pydoc следующей командой:

Листинг

pydoc–p 8088

И направить браузер на URL- можно получить документацию по модулям Python в виде красивого web–сайта.

Узнать другие возможности pydoc можно, подав команду pydoc pydoc.

Пакет docutils

Этот пакет и набор утилит пока что не входит в стандартную поставку Python, однако о нем нужно знать тем, кто хочет быстро готовить документацию (руководства пользователя и т.п.) для своих модулей. Этот пакет использует специальный язык разметки (ReStructuredText), из которого потом легко получается документация в виде HTML, LaTeX и в других форматах. Текст в формате RST легко читать и в исходном виде. С этим инструментом можно познакомиться на http://docutils.sourceforge.net

Пакет distutils

Данный пакет предоставляет стандартный путь для распространения собственных Python–пакетов. Достаточно написать небольшой конфигурационный файл setup.py, использующий distutils, и файл с перечислением файлов проекта MANIFEST.in, чтобы пользователи пакета смогли его установить командой

Листинг

python setup.py install

Тонкости работы с distutils можно изучить по документации.

Взаимодействие с операционной системой

Различные операционные системы имеют свои особенности. Здесь рассматривается основной модуль этой категории, функции которого работают на многих операционных системах.

Модуль os

Разделители каталогов и другие связанные с этим обозначения доступны в виде констант.

Константа Что обозначает

os.curdir Текущий каталог

os.pardir Родительский каталог

os.sep Разделитель элементов пути

os.altsep Другой разделитель элементов пути

os.pathsep Разделитель путей в списке путей

os.defpath Список путей по умолчанию

os.linesep Признак окончания строки

Программа на Python работает в операционной системе в виде отдельного процесса. Функции модуля os дают доступ к различным значениям, относящимся к процессу и к среде, в которой он исполняется. Одним из важных объектов, доступных из модуля os, является словарь переменных окружения environ. Например, с помощью переменных окружения web–сервер передает некоторые параметры в CGI–сценарий. В следующем примере можно получить переменную окружения PATH:

Поделиться:
Популярные книги

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Законы Рода. Том 13

Андрей Мельник
13. Граф Берестьев
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 13

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Цвет сверхдержавы - красный. Трилогия

Симонов Сергей
Цвет сверхдержавы - красный
Фантастика:
попаданцы
альтернативная история
8.06
рейтинг книги
Цвет сверхдержавы - красный. Трилогия

Болтливый мертвец

Фрай Макс
7. Лабиринты Ехо
Фантастика:
фэнтези
9.41
рейтинг книги
Болтливый мертвец

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь