В IPython
%lprun -f slow_func bench() - bench вызывает slow_funс, которую профилируем построчноNumPy - библиотека для научных вычислений на Python, написана на С и Fortran
Создание двух матриц 100х100 и перемножение:
import numpy as npX = np.random.randint(0, 256, (100, 100))Y = np.random.randint(0, 256, (100, 100))X.dot(Y)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)