SlideShare a Scribd company logo
1 of 16
Быстрые конструкции в python
Циклы 
val = 0 
i = 0 
while i < 10000: 
val += i 
i += 1 
from functools import reduce 
reduce(lambda res, x: res+x, range(10000)) 
val = 0 
for i in range(10000): 
val += i 
val = 0 
for i in xrange(10000): 
val += i 
744 мс. 
0.883 мс. 
0.415 мс. 
0.322 мс.
Условия 
10 < 10.0 
10.0 < 10.0 
10 < 10 
0.0 + 10 
float(10) 
Str(10) 
"{0}".format(10) 
48.5 нс 
38.4 нс 
26.8 нс 
15.8 нс 
100 нс 
137 нс 
116 нс
Список / Словарь 
a = [i for i in range(100000)] 
a = [0]*100000 
for i in a: 
a[i] = i 
a = [] 
for i in range(100000): 
a = a + [i] 
a = [] 
for i in range(100000): 
a += [i] 
a = [] 
for i in range(100000): 
a.append(i) 
a = [] 
append = a.append 
for i in range(100000): 
append(i) 
8.9 мс 
10.2 мс 
37000 мс (37 с.) 
14.2 мс 
8.8 мс 
6.03 мс
Список / Словарь 
words = ['asjasjd', 'akaksd', 'ajskskd', 'kasald'] 
a = {} 
for word in words: 
if word not in a: 
a[word] = 0 
a[word] += 1 
a = {} 
for word in words: 
try: 
a[word] += 1 
except KeyError: 
a[word] = 1 
a = {} 
get = a.get 
for word in words: 
a[word] = get(word, 0) + 1 
852 нс 
1600 нс 
681 нс
Арифметические операции 
pow(3, 30) 
3 ** 30 
math.sqrt(144) 
144 ** .5 
k = 1000 
k >> 1 
k / 2 
k << 1 
k * 2 
189 нс 
16.2 нс 
68.3 нс 
15.8 нс 
Python 2 Python 3 
39 нс 
52.3 нс 
38 нс 
50.3 нс 
65.6 нс 
49.9 нс 
68.8 нс 
45.1 нс
Строки 
str1 = 'val1' 
str2 = 'val2' 
str3 = 'val3' 
'str1: {} str2: {} str3: {}'.format(str1, str2, str3) 
"".join(['str1: ', str1, 'str2: ', str2, 'str3: ', str3]) 
'str1: ' + str1 + ' str2: ' + str2 + ' str3: ' + str3 
'str1: %s str2: %s str3: %s' % (str1, str2, str3) 
'str1: {0} str2: {1} str3: {2}'.format(str1, str2, str3) 
a = ['str1: ', str1, 'str2: ', str2, 'str3: ', str3] 
"".join(a) 
s = 'trashtrashtrashtrashabrakadabratrash' 
if s.find('abra') != -1 : pass 
if 'abra' in s : pass 
299 нс 
284 нс 
243 нс 
235 нс 
192 нс 
152 нс 
162 нс 
44.3 нс
Python медленный ?
Пример задачи 
Задан массив чисел. И поступила n запросов найти сумму от l до r. 
Очевидный вариант: 
s = 0 
for i in range(l, r+1): 
s += a[i] 
Продвинутый вариант: 
sum(a[l:r+1]) 
Тест: 10000 элементов, n = 10 
0.49 сек. 
0.224 сек.
Написать быструю структуру данных (Дерево 
отрезков):
class Tree(): 
def __init__(self, a): 
self.a = a 
self.t = [0] * len(a)*4 
self.build_tree(1, 0, len(self.a)-1) 
def build_tree(self, v, l, r): 
if l == r: 
self.t[v] = self.a[l] 
return self.t[v] 
mid = (l+r) // 2 
self.t[v] = self.build_tree(v*2, l, mid) + self.build_tree(v*2+1, mid+1, r) 
return self.t[v] 
def slice(self, v, l, r, tl, tr): 
if l == tl and r == tr: 
return self.t[v] 
mid = (l+r) // 2 
if tl >= l and tr <= mid: 
return self.slice(v*2, l, mid, tl, tr) 
if tl >= mid+1 and tr <= r: 
return self.slice(v*2+1, mid+1, r, tl, tr) 
return self.slice(v*2, l, mid, tl, mid) + self.slice(v*2+1, mid+1, r, mid+1, tr) 
0.1 сек.
Пример задачи 
Посчитать N-ое число Фибоначчи. (1, 1, 2, 3, 5, 8, 13 …. ) 
def fib(n): 
a = 0 
b = 1 
for i in xrange(n): 
a, b = b, a+b 
return a 
def fib2(n): 
matrix = [[1, 1], [1, 0]] 
return bin_pow(matrix, n+1)[1][1] 
При n = 3000 При n = 10^7 
370 мс. 
43.4 мс. 
25 мин. 
89 мс.
cpmoptimize 
from cpmoptimize import cpmoptimize 
@cpmoptimize() 
def fib(n): 
a = 0 
b = 1 
for i in xrange(n): 
a, b = b, a+b 
return a 
При n = 3000 При n = 10^7 
368 мс. 13 сeк.
cpmoptimize 
cpmoptimize.xrange(start, stop[, step]) 
cpmoptimize.cpmoptimize(strict=False, iters_limit=5000, 
types=(int, long), opt_min_rows=True, opt_clear_stack=True) 
Плюсы: 
- ускоряет работу программы 
- поддерживает большие типы данных 
- легкий в использовании 
- заботится о памяти 
Минусы: 
- оптимизирует только если все константы и переменные, 
используемые в нём, имеют допустимый тип 
- Тело цикла должно состоять только из инструкций присваивания, унарных 
и бинарных операций 
- Не может содержать условий, вызовов других функций, операторов return 
и yield
Другие методы ускорения 
1) PyPy — альтернативный интерпретатор Python с поддержкой JIT-компиляции 
2) Pyston — новый альтернативный интерпретатор Python, транслирующий код 
в промежуточное представление LLVM 
3) Nuitka — компилятор Python. Умеет создавать exe файлы 
4) astoptimizer — библиотека, применяющая известные методы оптимизации 
перед компиляцией в байт-код путём анализа и изменения абстрактного 
синтаксического дерева. 
5) foldy.py — библиотека, анализирующая байт-код и выполняющая 
сворачивание констант а также удаление неиспользуемых функций 
6) Numba — библиотека, ускоряющая программы, содержащие математические 
вычисления и операции с массивами. Оптимизация происходит за счёт JIT- 
компиляции 
7) Cython — оптимизирующий компилятор надмножества языка Python, 
позволяющий использовать в программе статическую типизацию и тесно 
взаимодействовать с кодом на C и C++.
Вывод 
1) Если что-то можно заменить на встроенные функции – надо менять, т.к. VM 
довольно медленная. 
2) Будьте внимательны к типам, так как из-за них можно потерять скорость в 2-4 
раза 
3) Меньше глобальных переменных 
4) Придумывайте алгоритмы 
5) Если не смогли придумать пользуйтесь оптимизациями

More Related Content

What's hot

Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.Roman Brovko
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
 
Лекция 4. Строки, байты, файлы и ввод/вывод.
 Лекция 4. Строки, байты, файлы и ввод/вывод. Лекция 4. Строки, байты, файлы и ввод/вывод.
Лекция 4. Строки, байты, файлы и ввод/вывод.Roman Brovko
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности PythonPyNSK
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.Roman Brovko
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Platonov Sergey
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Roman Brovko
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILRoman Brovko
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки PythonPython Meetup
 
Something about Golang
Something about GolangSomething about Golang
Something about GolangAnton Arhipov
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 

What's hot (20)

Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
 
Лекция 4. Строки, байты, файлы и ввод/вывод.
 Лекция 4. Строки, байты, файлы и ввод/вывод. Лекция 4. Строки, байты, файлы и ввод/вывод.
Лекция 4. Строки, байты, файлы и ввод/вывод.
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GIL
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 

Viewers also liked

Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка TwistedPython Meetup
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...Python Meetup
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Python Meetup
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюPython Meetup
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingPython Meetup
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Python Meetup
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer WargamingPython Meetup
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GOPython Meetup
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Python Meetup
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Python Meetup
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Python Meetup
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014Python Meetup
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python Meetup
 

Viewers also liked (17)

Pebble
PebblePebble
Pebble
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка Twisted
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностью
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer Wargaming
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
 

Similar to Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014

Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Roman Brovko
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введениеmcroitor
 
Основы языка Питон: типы данных, операторы
Основы языка Питон: типы данных, операторыОсновы языка Питон: типы данных, операторы
Основы языка Питон: типы данных, операторыTheoretical mechanics department
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3etyumentcev
 
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...CEE-SEC(R)
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8chashnikov
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноOpen-IT
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Theoretical mechanics department
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03Computer Science Club
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 

Similar to Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014 (20)

Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
 
Основы языка Питон: типы данных, операторы
Основы языка Питон: типы данных, операторыОсновы языка Питон: типы данных, операторы
Основы языка Питон: типы данных, операторы
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатно
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Основы языка R
Основы языка RОсновы языка R
Основы языка R
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 

More from Python Meetup

Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данныхPython Meetup
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Python Meetup
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиPython Meetup
 
Введение в GIL и новый GIL
Введение в GIL и новый GILВведение в GIL и новый GIL
Введение в GIL и новый GILPython Meetup
 
Социальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаСоциальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаPython Meetup
 
Портируем на Python 3
Портируем на Python 3Портируем на Python 3
Портируем на Python 3Python Meetup
 
Garbage collector and a bit of memory management
Garbage collector and a bit of memory managementGarbage collector and a bit of memory management
Garbage collector and a bit of memory managementPython Meetup
 
Неочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийНеочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийPython Meetup
 
Dictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtDictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtPython Meetup
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть IIPython Meetup
 

More from Python Meetup (10)

Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данных
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузки
 
Введение в GIL и новый GIL
Введение в GIL и новый GILВведение в GIL и новый GIL
Введение в GIL и новый GIL
 
Социальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаСоциальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшена
 
Портируем на Python 3
Портируем на Python 3Портируем на Python 3
Портируем на Python 3
 
Garbage collector and a bit of memory management
Garbage collector and a bit of memory managementGarbage collector and a bit of memory management
Garbage collector and a bit of memory management
 
Неочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийНеочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкций
 
Dictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtDictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txt
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть II
 

Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014

  • 2. Циклы val = 0 i = 0 while i < 10000: val += i i += 1 from functools import reduce reduce(lambda res, x: res+x, range(10000)) val = 0 for i in range(10000): val += i val = 0 for i in xrange(10000): val += i 744 мс. 0.883 мс. 0.415 мс. 0.322 мс.
  • 3. Условия 10 < 10.0 10.0 < 10.0 10 < 10 0.0 + 10 float(10) Str(10) "{0}".format(10) 48.5 нс 38.4 нс 26.8 нс 15.8 нс 100 нс 137 нс 116 нс
  • 4. Список / Словарь a = [i for i in range(100000)] a = [0]*100000 for i in a: a[i] = i a = [] for i in range(100000): a = a + [i] a = [] for i in range(100000): a += [i] a = [] for i in range(100000): a.append(i) a = [] append = a.append for i in range(100000): append(i) 8.9 мс 10.2 мс 37000 мс (37 с.) 14.2 мс 8.8 мс 6.03 мс
  • 5. Список / Словарь words = ['asjasjd', 'akaksd', 'ajskskd', 'kasald'] a = {} for word in words: if word not in a: a[word] = 0 a[word] += 1 a = {} for word in words: try: a[word] += 1 except KeyError: a[word] = 1 a = {} get = a.get for word in words: a[word] = get(word, 0) + 1 852 нс 1600 нс 681 нс
  • 6. Арифметические операции pow(3, 30) 3 ** 30 math.sqrt(144) 144 ** .5 k = 1000 k >> 1 k / 2 k << 1 k * 2 189 нс 16.2 нс 68.3 нс 15.8 нс Python 2 Python 3 39 нс 52.3 нс 38 нс 50.3 нс 65.6 нс 49.9 нс 68.8 нс 45.1 нс
  • 7. Строки str1 = 'val1' str2 = 'val2' str3 = 'val3' 'str1: {} str2: {} str3: {}'.format(str1, str2, str3) "".join(['str1: ', str1, 'str2: ', str2, 'str3: ', str3]) 'str1: ' + str1 + ' str2: ' + str2 + ' str3: ' + str3 'str1: %s str2: %s str3: %s' % (str1, str2, str3) 'str1: {0} str2: {1} str3: {2}'.format(str1, str2, str3) a = ['str1: ', str1, 'str2: ', str2, 'str3: ', str3] "".join(a) s = 'trashtrashtrashtrashabrakadabratrash' if s.find('abra') != -1 : pass if 'abra' in s : pass 299 нс 284 нс 243 нс 235 нс 192 нс 152 нс 162 нс 44.3 нс
  • 9. Пример задачи Задан массив чисел. И поступила n запросов найти сумму от l до r. Очевидный вариант: s = 0 for i in range(l, r+1): s += a[i] Продвинутый вариант: sum(a[l:r+1]) Тест: 10000 элементов, n = 10 0.49 сек. 0.224 сек.
  • 10. Написать быструю структуру данных (Дерево отрезков):
  • 11. class Tree(): def __init__(self, a): self.a = a self.t = [0] * len(a)*4 self.build_tree(1, 0, len(self.a)-1) def build_tree(self, v, l, r): if l == r: self.t[v] = self.a[l] return self.t[v] mid = (l+r) // 2 self.t[v] = self.build_tree(v*2, l, mid) + self.build_tree(v*2+1, mid+1, r) return self.t[v] def slice(self, v, l, r, tl, tr): if l == tl and r == tr: return self.t[v] mid = (l+r) // 2 if tl >= l and tr <= mid: return self.slice(v*2, l, mid, tl, tr) if tl >= mid+1 and tr <= r: return self.slice(v*2+1, mid+1, r, tl, tr) return self.slice(v*2, l, mid, tl, mid) + self.slice(v*2+1, mid+1, r, mid+1, tr) 0.1 сек.
  • 12. Пример задачи Посчитать N-ое число Фибоначчи. (1, 1, 2, 3, 5, 8, 13 …. ) def fib(n): a = 0 b = 1 for i in xrange(n): a, b = b, a+b return a def fib2(n): matrix = [[1, 1], [1, 0]] return bin_pow(matrix, n+1)[1][1] При n = 3000 При n = 10^7 370 мс. 43.4 мс. 25 мин. 89 мс.
  • 13. cpmoptimize from cpmoptimize import cpmoptimize @cpmoptimize() def fib(n): a = 0 b = 1 for i in xrange(n): a, b = b, a+b return a При n = 3000 При n = 10^7 368 мс. 13 сeк.
  • 14. cpmoptimize cpmoptimize.xrange(start, stop[, step]) cpmoptimize.cpmoptimize(strict=False, iters_limit=5000, types=(int, long), opt_min_rows=True, opt_clear_stack=True) Плюсы: - ускоряет работу программы - поддерживает большие типы данных - легкий в использовании - заботится о памяти Минусы: - оптимизирует только если все константы и переменные, используемые в нём, имеют допустимый тип - Тело цикла должно состоять только из инструкций присваивания, унарных и бинарных операций - Не может содержать условий, вызовов других функций, операторов return и yield
  • 15. Другие методы ускорения 1) PyPy — альтернативный интерпретатор Python с поддержкой JIT-компиляции 2) Pyston — новый альтернативный интерпретатор Python, транслирующий код в промежуточное представление LLVM 3) Nuitka — компилятор Python. Умеет создавать exe файлы 4) astoptimizer — библиотека, применяющая известные методы оптимизации перед компиляцией в байт-код путём анализа и изменения абстрактного синтаксического дерева. 5) foldy.py — библиотека, анализирующая байт-код и выполняющая сворачивание констант а также удаление неиспользуемых функций 6) Numba — библиотека, ускоряющая программы, содержащие математические вычисления и операции с массивами. Оптимизация происходит за счёт JIT- компиляции 7) Cython — оптимизирующий компилятор надмножества языка Python, позволяющий использовать в программе статическую типизацию и тесно взаимодействовать с кодом на C и C++.
  • 16. Вывод 1) Если что-то можно заменить на встроенные функции – надо менять, т.к. VM довольно медленная. 2) Будьте внимательны к типам, так как из-за них можно потерять скорость в 2-4 раза 3) Меньше глобальных переменных 4) Придумывайте алгоритмы 5) Если не смогли придумать пользуйтесь оптимизациями