PyPy - во время выполнения компилирует в машинный код наиболее часто используемый код
from numba import jitfrom numpy import arange# jit decorator tells Numba to compile this function.# The argument types will be inferred by Numba when function is called.@jitdef sum2d(arr): M, N = arr.shape result = 0.0 for i in range(M): for j in range(N): result += arr[i,j] return resulta = arange(9).reshape(3,3)print(sum2d(a))В NumPy ndarray -
X[i][j] - каждый вызов создает слайс X[i], следует писать X[i, j]Cython типизированное расширение языка Python
Оптимизирующий компилятор Python и Сython в код на C, использующий C-API интерпретатора CPython
Оптимизирующий компилятор Python и Сython в код на C, использующий C-API интерпретатора CPython
Компиляция кода на pure-Python с помощью Cython может дать небольшой прирост производительности
С помощью
jupyter и "%%cython -a" можно посмотреть Сишную имплементацию кода на питон по-строчно!IPython
%timeit example:%timeit -c main.check("122342344234234")9.32 ms ± 308 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)from bitcoin import *private_key = sha256(seed)public_key = privtopub(private_key)addr = pubtoaddr(public_key)Язык динамический, но для наглядности можно указать типы передаваемых параметров
def test(s: str, b: int): print(s*2) print(b*10)Скачивание страниц в разных потоках
from concurrent.futures import ThreadPoolExecutor as Executorurls = """google twitter facebook youtube pinterest tumblr instagram reddit flickr meetup classmates microsoft apple linkedin xing renren disqus snapchat twoo whatsapp""".split()def fetch(url): from urllib import request, error try: data = request.urlopen(url).read() return '{}: length {}'.format(url, len(data)) except error.HTTPError as e: return '{}: {}'.format(url, e)with Executor(max_workers=4) as exe: template = 'http://www.{}.com' jobs = [exe.submit(fetch, template.format(u)) for u in urls] results = [job.result() for job in jobs] print('\n'.join(results))Заменяем Executor на ProcessPoolExecutor получаем скачивание в разных процессах
from concurrent.futures import ProcessPoolExecutor as ExecutorЛогирование
import logginglogger = logging.getLogger()logger.debug('This is for debugging. Very talkative!')logger.info('This is for normal chatter')logger.warning('Warnings should almost always be seen.')logger.error('You definitely want to see all errors!')logger.critical('Last message before a program crash!')if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG)