Hackspeed amb Cython

Bloc

Hackspeed amb Cython

Hackspeed amb Cython

Python és un dels llenguatges de programació més populars i populars actualment. No obstant això, quan treballeu amb Python, veureu o escoltarà un dels punts febles fins a aquest punt: Python is slow.

Hi ha diverses maneres d’accelerar el vostre codi Python. Potser el llegiu en algun lloc:

veure la televisió nba en línia gratuïta reddit
  • Ús de biblioteques de processament múltiple
  • Utilització asíncrona

Com a l’anterior, us apropareu als dos costats per accelerar el codi Python: parallel programming i asynchronous programming. Ara, presentaré un enfocament diferent. És a dir Cython.

Què és Cython?

Entendre Cython és un pas intermedi entre Python i C / C ++. Us permet escriure Python pur amb algunes modificacions menors i traduir-lo directament a C.

Cython us proporcionarà la potència combinada de Python i C:

  • El codi Python crida al codi natiu C o C ++ d’anada i tornada en qualsevol moment.
  • Modifiqueu fàcilment el codi Python per obtenir un rendiment com el codi C simplement afegint declaracions de tipus estàtiques, també a la sintaxi Python.
  • Interactueu eficaçment amb el conjunt de dades grans.
  • Integreu natives amb codi, llibreries / aplicacions de baix nivell o d’alt rendiment existents.
  • ...

Alguna altra informació:

Podeu fer fàcilment Cython mitjançant pip

pip install cython

En comparació amb el codi Python, cal afegir informació de tipus a cada variable. Normalment, per declarar una variable Python, és molt senzill:

x = 1

Amb Cython, heu d'afegir el tipus d'aquesta variable:

nba live steam reddit
cdef int x = 1

Igual que a C, es requereix la declaració de tipus per a una variable de Cython.

Tipus a Cython

En utilitzar Cython, hi ha dos punts diferents per a variables i funcions.

Per a variables:

cdef int a, b, c cdef char *s cdef float x = 0.5 (single precision) cdef double x = 60.4 (double precision) cdef list images cdef dict user cdef object card_deck

Tots aquests tipus es deriven de C / C ++.

Per a la funció:

def function1... cdef function2... cpdef function2...

Amb:

  • def: Funció python pur, només cridada des de Python.
  • cdef: Cython només funciona. Només es truca des de Cython.
  • cpdef: funció C i Python. Es pot trucar des de C i Python.

Com accelerar el vostre codi amb Cython

En primer lloc, crearé un codi Python pur amb el bucle for.

#run_test_python.py def test_python(x): y = 1 for i in range(1, x+1): y *= i return y

Aplicant el que he entès anteriorment, escriuré el codi a Cython amb un significat:

c # enllaç dinàmic
#run_test_cython.pyx cpdef int test_cython(int x): cdef int y = 1 cdef int i for i in range(1, x+1): y *= i return y

Quan codifiqueu Cython, assegureu-vos que totes les vostres variables estiguin configurades.

A continuació, hem de crear un fitxer per compilar des de Cython -> codi C:

# setup.py from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize('run_test_cython.pyx'))

Després de posar run_test_cython.pyx i setup.py amb dir, comencem a compilar:

% python setup.py build_ext --inplace Compiling run_test_cython.pyx because it changed. [1/1] Cythonizing run_test_cython.pyx running build_ext building 'run_test_cython' extension creating build creating build/temp.linux-x86_64-3.6 gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/home/ha.hao.minh/.pyenv/versions/viblo-venv/include -I/home/ha.hao.minh/.pyenv/versions/3.6.8/include/python3.6m -c run_test_cython.c -o build/temp.linux-x86_64-3.6/run_test_cython.o gcc -pthread -shared -L/home/ha.hao.minh/.pyenv/versions/3.6.8/lib -L/home/ha.hao.minh/.pyenv/versions/3.6.8/lib build/temp.linux-x86_64-3.6/run_test_cython.o -o /home/ha.hao.minh/workspace/viblo/112019/run_test_cython.cpython-36m-x86_64-linux-gnu.so

Resultat:

% ls build run_test_cython.c run_test_cython.cpython-36m-x86_64-linux-gnu.so run_test_cython.pyx run_test_python.py setup.py

Veureu en aquesta carpeta que conté tots els fitxers necessaris per executar el codi C. Si teniu curiositat en què compilarà l’altre codi Cython, és en quin codi C podeu visualitzar aquest fitxer:

cat run_test_cython.c

Vinga, és hora de mostrar la potència del codi C. El següent codi compara la velocitat de Python pure i Cython:

# speedtest.py import run_test_python import run_test_cython import time def speedtest_python(number): start = time.time() run_test_python.test_python(number) end = time.time() py_time = end - start print(f'Python time = {py_time}') return py_time def speedtest_cython(number): start = time.time() run_test_cython.test_cython(number) end = time.time() cy_time = end - start print('Cython time = {}'.format(cy_time)) return cy_time if __name__=='__main__': for number in [10, 100, 1000, 10000, 100000]: print(f'Speedtest with number = {number}') py_time = speedtest_python(number) cy_time = speedtest_cython(number) print('Speedup = {}'.format(py_time / cy_time))

Resultats després d'executar speedtest.py

% python speedtest.py Speedtest with number = 10 Python time = 3.5762786865234375e-06 Cython time = 7.152557373046875e-07 Speedup = 5.0 Speedtest with number = 100 Python time = 7.867813110351562e-06 Cython time = 2.384185791015625e-07 Speedup = 33.0 Speedtest with number = 1000 Python time = 0.0002810955047607422 Cython time = 9.5367431640625e-07 Speedup = 294.75 Speedtest with number = 10000 Python time = 0.02144336700439453 Cython time = 7.62939453125e-06 Speedup = 2810.625 Speedtest with number = 100000 Python time = 3.1171438694000244 Cython time = 8.630752563476562e-05 Speedup = 36116.70994475138

Amb la configuració actual del dispositiu per a la meva prova:

  • CPU: CPU Intel® Core ™ i5-4460 @ 3,20 GHz × 4
  • RAM: 8G

Empleneu els resultats de la taula per facilitar la visualització:

numpy obté índexs on la condició és certa

Nombre Temps de pitó Temps de pitó Velocitat augmentada

36116 - Sembla un número impensable

És evident que Cython us ofereix un rendiment molt bo. Aquesta també és una solució viable si voleu millorar el vostre codi.

#python #cython