Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Python infrastructure from scratch

44 views

Published on

Python infrastructure, concurrency and whats new in 3.5/3.6.

Published in: Education
  • Be the first to comment

  • Be the first to like this

Python infrastructure from scratch

  1. 1. Тыщенко Виктор, 2017
  2. 2. Python Enhancement Proposals (PEPs) ● PEP 8 - Style Guide for Python Code ● PEP 20 - The Zen of Python ● PEP 249 - Python Database API Specification ● PEP 257 - Docstring Conventions ● PEP 202 - List Comprehensions ● PEP 3120 - Using UTF-8 as the default source encoding ● PEP 492 - Coroutines with async and await syntax
  3. 3. PEP 8 ● 4 пробела на отступ ● Форматирование только пробелами ● Пустые строки между классами и методами ● Запись аргументов функции ● Пробелы внутри выражений ● Документация ● Именование переменных When applying the guideline would make the code less readable, even for someone who is used to reading code that follows this PEP.
  4. 4. Python StdLib Чтение csv файла with open('names.csv') as csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row['first_name'], row['last_name']) Сравнение двух списков s1 = ['baconn', 'eggsn', 'hamn', 'guidon'] s2 = ['pythonn', 'eggyn', 'hamstern', 'guidon'] sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py')) Работа с датами begin = datetime.strptime(‘17/09/17’, "%d/%m/%y") end = begin + timedelta(days=10) Работа с архивом zipfile = ZipFile(zip_file) zip_names = zipfile.namelist() for zip_name in zip_names: If zip_name.endswith(‘.txt’): zipfile.extract(zip_name) Работа с БД conn = sqlite3.connect(':memory:') cursor = conn.cursor() cursor.execute('SELECT SQLITE_VERSION()') print(cursor.fetchone()) >>> ('3.19.3',) Простейший HTTP сервер $ python -m SimpleHTTPServer Serving HTTP on 0.0.0.0 port 8000 ...
  5. 5. Продуктивность Python, в целом, наиболее краток, даже в сравнении с функциональными языками. https://arxiv.org/pdf/1409.0252.pdf https://blog.codinghorror.com/are-all-programming-languages-the-same/
  6. 6. Парадигмы программирования ● Объектно-ориентированная class AccountView(View): http_method_names = ['post'] def dispatch(self, request, *args, **kwargs): ... ● Функциональная reduce(lambda x, y: x + y, map(lambda x: x*x, [1, 2, 3, 4]), 0) ● Аспектно-ориентированная @login_required def update_profile(request): ... ● Предметно-ориентированная s = Search(using=client, index="my-index") .filter("term", category="search") .query("match", title="python") .exclude("match", description="beta")
  7. 7. Известные продукты
  8. 8. GeoPuzzle
  9. 9. Сферы применения? ● DevOps: ansible, salt, fabric ● GUI приложения: pyQt, pyGTK, pyGlade ● BigData: numpy, scipy, pandas, matplotlib ● OpenCV ● Парсинг: scrapy, grab ● Боты: slack, telegram, skype ● Web-фреймворки: Django, Flask, pyramid, aiohttp
  10. 10. asyncio ● Postgresql: aiopg, asyncpg ● Redis: aioredis ● HTTP server: aiohttp, sanic ● ZeroMQ: aiozmq ● MongoDB: motor ● Elasticsearch: aioes from sanic import Sanic from sanic.response import json @app.route("/") async def test(request): return json({"hello": "world"}) if __name__ == "__main__": app = Sanic() app.run(host="0.0.0.0", port=8000) import asyncio, asyncpg async def run(): conn = await asyncpg.connect(host='127.0.0.1', user='user', password='password', database='database') values = await conn.fetch('''SELECT * FROM mytable''') await conn.close() loop = asyncio.get_event_loop() loop.run_until_complete(run())
  11. 11. asyncio import asyncio async def foo(): print('Running in foo') await asyncio.sleep(0) print('Explicit context switch to foo again') async def bar(): print('Explicit context to bar') await asyncio.sleep(0) print('Implicit context switch back to bar') ioloop = asyncio.get_event_loop() tasks = [ioloop.create_task(foo()), ioloop.create_task(bar())] wait_tasks = asyncio.wait(tasks) ioloop.run_until_complete(wait_tasks) ioloop.close() Running in foo Explicit context to bar Explicit context switch to foo again Implicit context switch back to bar
  12. 12. uvloop Intel Xeon CPU E5-1620 v2 @ 3.70GHz concurrency = 300 time = 30 sec
  13. 13. Да, Python медленный, но меня это не волнует https://habrahabr.ru/post/329988/
  14. 14. Реализации ● Cpython → LLVM ● IronPython → .Net ● Jython → JVM ● Cython → C ● Grumpy → Go ● MicroPython → микроконтроллеры ● PyPy → LLVM, .Net, JVM с JIT-компиляцией
  15. 15. Cython cpdef int myfunction(int x, int y=2): a = x - y return a + x * y cdef double _helper(double a): return a + 1 cdef class A: cdef public int a,b def __init__(self, b=0): self.a = 3 self.b = b cpdef foo(self, double x): print x + _helper(1.0) > cython --embed example.pyx -o example.c > gcc -g -O2 -o example example.c `python-config --includes --ldflags`
  16. 16. Type hinting from typing import Any, Iterator def register_namespace(prefix: str, uri: str) -> Iterator[str]: ... def iselement(element: Any) -> bool: ...
  17. 17. Python 3.6 ● Форматирование строк: name = "Fred" f"He said his name is {name}." ● “Читаемость имеет значение”: 1_000_000 или 0x_FF_FF_FF ● List comprehensions result = [i async for i in aiter() if i % 2] result = [await fun() for fun in funcs if await condition()] ● Словарь потребляет на 20% меньше памяти ● Скорость работы на 10% больше
  18. 18. Спасибо за внимание! и маленькая просьба... Тыщенко Виктор tyvik8@gmail.com tyvik.ru, geopuzzle.org

×