Полезные советы по Python::Журнал СА 10.2006
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Архив номеров
Контакты
   

  Опросы
  Статьи

Рынок труда  

Системные администраторы по-прежнему востребованы и незаменимы

Системные администраторы, практически, есть везде. Порой их не видно и не слышно,

 Читать далее...

Учебные центры  

Карьерные мечты нужно воплощать! А мы поможем

Школа Bell Integrator открывает свои двери для всех, кто хочет освоить перспективную

 Читать далее...

Гость номера  

Дмитрий Галов: «Нельзя сказать, что люди становятся доверчивее, скорее эволюционирует ландшафт киберугроз»

Использование мобильных устройств растет. А вместе с ними быстро растет количество мобильных

 Читать далее...

Прошу слова  

Твердая рука в бархатной перчатке: принципы soft skills

Лауреат Нобелевской премии, специалист по рынку труда, профессор Лондонской школы экономики Кристофер

 Читать далее...

Как хорошо вы это знаете  

Портал Инкоманд. Для чего он? Для кого? Какие проблемы решает?

Компания «ЕМДЕВ» – создатель интернет-портала, предлагает всем желающим протестировать себя на

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 9997
Комментарии: 0
Потоковая обработка данных

 Читать далее...

19.03.2018г.
Просмотров: 8212
Комментарии: 0
Релевантный поиск с использованием Elasticsearch и Solr

 Читать далее...

19.03.2018г.
Просмотров: 8303
Комментарии: 0
Конкурентное программирование на SCALA

 Читать далее...

19.03.2018г.
Просмотров: 5272
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 5947
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

Друзья сайта  

 Полезные советы по Python

Архив номеров / 2006 / Выпуск №10 (47) / Полезные советы по Python

Рубрика: Программирование /  Программирование

Полезные советы по Python

Используйте функцию map()

И не только её. Python предоставляет три мощных функции для обработки последовательностей – map(), filter() и reduce(). Первая позволяет применить к каждому элементу одной или нескольких последовательностей заданную функцию, вторая – получить подпоследовательность по тому или иному критерию, третья – «свернуть» последовательность (например, просуммировать все элементы):

>>> def tostr(a, b):

...              return a + b

...

>>> list = [1,2,3,4,5]

>>> map(str, list)

['1', '2', '3', '4', '5']

>>> filter(lambda i: i>3, list)

[4, 5]

>>> reduce(tostr, list)

15

>>> reduce(tostr, map(str, list))

'12345'

Это не только удобно, но и быстро, поскольку внутренний цикл этих функций реализован на C. Для функции filter() показано применение lambda-функции. Так же можно было бы поступить и в случае с reduce(), но для наглядности оставлен «классический» способ.

Подружитесь с lambda

Иногда возникает необходимость использовать некоторую функцию «локально». В Python использовать безымянную функцию позволяет оператор lambda:

>>> a = lambda a,b: a*a + a*b + b*b

>>> a(2,3)   # аргументы 2 -> a, 3 -> b

19

>>> (lambda a,b: a+b)(2,3)

5

Гораздо больший смысл она приобретает там, где синтаксис требует указать функцию, но определять её оператором def неудобно. Типичный пример – функции обработки последовательностей, описанные в следующем совете.

Складывайте строки вдумчиво

Сложение строк в Python выполняется не слишком быстро. Поэтому если вам нужно получить строку из списка элементов, лучше использовать для этого метод join:

#s = ''

#for i in xrange(1000000):

#      s += str(i)

s = ''.join([str(i) for i in xrange(1000000)])

Последняя строка, помимо того что занимает меньше места в коде, чем предыдущие три (которые закомментированы и соответствуют «стандартному» решению), ещё и отработает процентов на 15 быстрее. Если работать нужно с уже готовой последовательностью, как и бывает на практике, а не генерировать её искусственно, то прирост скорости будет ещё выше.

А вот повсеместный совет вместо strA + strB использовать форматное преобразование ‘%s%s’ % (strA, strB), на практике не подтвердился – по крайней мере, в Python 2.4.3 простое сложение выполнялось примерно на 35% быстрее, чем форматирование. С ростом размера строк этот разрыв сокращается, но даже при сложении строк из 26000 символов традиционное суммирование выполнялось быстрее.

Используйте xrange()

В Python, как известно, нет цикла for в стиле языка C – здесь for выполняет проход по элементам последовательности (в Perl есть похожий оператор – foreach). Поэтому для построения циклов, записываемых, скажем, в Perl как for($i=0; $i < 1000; $i++), в Python используется функция-генератор последовательности – range(), формирующая список целых чисел, по которому затем и выполняется цикл: for i in range(1000).

Однако это неэффективно на больших значениях – ведь сначала нужно создать список, разместить его в памяти, и только затем начнётся обработка цикла. Избежать этого позволяет функция xrange(), которая не формирует последовательность физически, а создаёт объект, который лишь имитирует её, генерируя нужные элементы по мере необходимости.

Благодаря тому, что внутренне xrange() реализована на C, она выполняется довольно быстро. А поскольку последовательность не требует размещения в памяти, можно писать даже такие циклы:

for i in xrange(10000000):

             . . . .

Использование range() с таким значением привело бы систему к непрерывному «свопингу».

Выносите максимум за пределы цикла

Истина, известная любому студенту. В Python за пределы цикла можно вынести даже определение методов:

list = []

func = list.append

for i in xrange(5000000):

   #     list.append(i)

         func(i)

Казалось бы – какая мелочь! Но благодаря тому, что на каждой итерации цикла интерпретатору не приходится искать метод append() у объекта list, этот код выполняется быстрее «обычного» почти на 30% (на реальных, более полезных циклах, конечно, прирост скорости будет не столь ошеломительным).

Живите в ногу со временем

19 сентября выпущен Python 2.5. Помимо ряда обычных для любой новой версии улучшений и исправлений ошибок, в синтаксисе языка появился ряд новых конструкций, а также заявлена более высокая скорость работы, особенно с Unicode-строками.

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

Сергей Супрунов


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru