Фишки Python
29 subscribers
2 photos
3 files
29 links
Всё что ты хотел узнать, но ленился спросить.

Декораторы, итераторы и контракты.
Download Telegram
source = """
def test_me():
s = 0
for i in range(1000000):
s += i**2
return s
test_me()
"""

cProfile.run(source, sort="tottime")

4 function calls in 0.531 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.531 0.531 0.531 0.531 <string>:2(test_me)
1 0.000 0.000 0.531 0.531 {built-in method builtins.exec}
1 0.000 0.000 0.531 0.531 <string>:2(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
cProfile - профилирует вызовы функций, бесполезен при профилировании одной функции
pip install line_profiler
Построчное профилирование функций
В IPython %lprun -f slow_func bench() - bench вызывает slow_funс, которую профилируем построчно
NumPy - библиотека для научных вычислений на Python, написана на С и Fortran
Создание двух матриц 100х100 и перемножение:

import numpy as np

X = np.random.randint(0, 256, (100, 100))
Y = np.random.randint(0, 256, (100, 100))

X.dot(Y)
PyPy - во время выполнения компилирует в машинный код наиболее часто используемый код
LLVM - low level virtual machine
from numba import jit
from numpy import arange

# jit decorator tells Numba to compile this function.
# The argument types will be inferred by Numba when function is called.
@jit
def sum2d(arr):
M, N = arr.shape
result = 0.0
for i in range(M):
for j in range(N):
result += arr[i,j]
return result

a = arange(9).reshape(3,3)
print(sum2d(a))
Numba компилирует в LLVM помеченные декоратором @jit функции
В NumPy ndarray - X[i][j] - каждый вызов создает слайс X[i], следует писать X[i, j]
Cython типизированное расширение языка Python
Оптимизирующий компилятор Python и Сython в код на C, использующий C-API интерпретатора CPython
Компиляция кода на pure-Python с помощью Cython может дать небольшой прирост производительности
С помощью jupyter и "%%cython -a" можно посмотреть Сишную имплементацию кода на питон по-строчно!
Welcome Blockchain Hell

pip install base58
IPython %timeit example:

%timeit -c main.check("122342344234234")
9.32 ms ± 308 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)