Показаны сообщения с ярлыком Генераторы. Показать все сообщения
Показаны сообщения с ярлыком Генераторы. Показать все сообщения

17 апреля 2013 г.

Хронометраж в Python -e

С помощью хронометража в Python -e, мы научимся измерять время действия любой функции, или же другими словами проверить скорость ее работы, также относится к циклам и т.д. и т.п.

Так вот чтоб все это можно было сделать мы будем использовать модуль Time, который уже есть в инструкциях Python -a.

Для того чтоб все это работало мы создадим и сохраним на долго, утилиту timer.


# Файл mytimer.py

import time
reps = 1000
repslist = range(reps)

def timer(func, *pargs, **kargs):
    start = time.clock()
    for i in repslist:
        ret = func(*pargs, **kargs)
    elapsed = time.clock() - start
    return (elapsed, ret) 

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

  • Модуль time из стандартной библиотеки языка Python позволяет получить текущее  время  с  точностью,  зависящей  от  платформы.  В  Windows,  как утверждается, этот  модуль  позволяет получить  время  с точностью до  микросекунды и, следовательно, обеспечивает высокую точность. 
  • Вызов функции range был вынесен за пределы цикла измерения времени, благодаря чему время конструирования диапазона не накладывается на получаемые результаты в Python 2.6. В Python 3.0 функция range возвращает итератор, поэтому в версии 3.0 данный шаг можно считать излишним (хотя он и не мешает).
  • Счетчик reps  оформлен как глобальная переменная, благодаря чему  она 
может изменяться импортирующим модулем при необходимости: mytimer. 
reps = N.

Далее будет подробней...

15 апреля 2013 г.

Понимание генераторов множеств и словарей

Сейчас 2 часа  ночи, я ничего не понимаю, что относится к программированию на Python, но пишу этот пост... надеюсь кому то он поможет.


>>> {x * x for x in range(10)}         # Генератор
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}

>>> set(x * x for x in range(10)) # Генератор и конструктор типа
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}

>>> {x: x * x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

>>> dict((x, x * x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

13 апреля 2013 г.

Краткая сводка по синтаксису генераторов в Python 3.0

В данном посте, мы попытаемся показать все разновидности генераторов



  • В случае с множествами {1, 3, 2} эквивалентна вызову set([1, 3, 2]), а новый синтаксис генераторов множеств {f(x) for x in S if P(x)}, напоминает синтаксис выражений-генераторов set(f(x) for x in S if P(x)), где f(x) – произвольное выражение.

  • В случае со словарями новая конструкция генераторов словарей {key: val for (key, val) in zip(keys, vals)} действует точно так же, как dict(zip(keys, vals)), and {x: f(x) for x in items}, и напоминает выражение-генератор dict((x, f(x)) for x in items).
Ниже показана краткая сводка по всем альтернативным генераторам в версии Python 3.0.  Последние  две конструкции являются новыми  и  недоступны  в версии Python 2.6:
>>> [x * x for x in range(10)]       # Генератор списков:
                                     # конструирует список
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # подобно вызову 
                                     # list(generator expr)
>>> (x * x for x in range(10))       # Выражение-генератор: 
                                     # воспроизводит 
<generator object at 0x009E7328>     # элементы. Скобки часто
                                     # необязательны
>>> {x * x for x in range(10)}       # Генератор множеств,
                                     # новинка в Python 3.0
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36} # {x, y} – литерал множества 
                                     # в Python 3.0
>>> {x: x * x for x in range(10)}    # Генератор словарей,
                                     # новинка в Python 3.0
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

11 апреля 2013 г.

Создание собственных версий функций zip(...) и map(None, ...)


В предыдущих постах мы создавали якобы свои функции zip и map . Но это не совсем то, что нам нужно, так как создавая одну из них мы использовали вторую - которая встроена в язык программирования Python.

Поэтому в этом посте мы это полностью исправим. Кстати в разных версиях, map работает по разному, вот некоторые примеры для Python 2.x и Python 3.0.


C:\misc> c:\python26\python
>>> map(None, [1, 2, 3], [2, 3, 4, 5])
[(1, 2), (2, 3), (3, 4), (None, 5)]
>>> map(None, ‘abc’, ‘xyz123’)
[(‘a’, ‘x’), (‘b’, ‘y’), (‘c’, ‘z’), (None, ‘1’), (None, ‘2’), (None, ‘3’)]

2 апреля 2013 г.

Генераторы - объекты итераторов однократного применения


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


Например, для выражения-генератора из предыдущего поста итератором является сам генератор (фактически вызов
метода iter генератора не выполняет никаких действий):
>>> G = (c * 4 for c in ‘SPAM’)
>>> iter(G) is G # Итератором генератора является сам генератор: 
True # G имеет метод __next__