Un peu de cython





Nous avons mis la main sur Cythona, grâce à l'auto-isolement. Le problème est prosaïque - comment accélérer en python avec une perte de syntaxe minimale. Une approche consiste à utiliser Cython (un mélange de C et de python).



La publication au titre fort hanté . Mais on ne peut pas apprendre grand-chose du contenu de la publication, car les formules et le tableau résultant sont incorrects. Essayons de compléter l'image commencée par les auteurs de l'article et de mettre les points et.



* Les tests ont été réalisés sur odroid xu4, ubuntu mate, python 2.7.17.

Cython est facile à installer (pip install cython).



Nous torturerons tous les mêmes numéros de Fibonacci. Créons des fichiers pour les tests de gain de performance. Pour le langage python (test.py):



def test(n):
   a, b = 0.0, 1.0
   for i in range(n):
      a, b = a + b, a
   print (a)


Pour le langage cython (test2.pyx):



def test2(int n):
   cdef int i
   cdef double a=0.0, b=1.0
   for i in range(n):
      a, b = a + b, a
   print (a)


Le fichier cython nécessite une pré-construction. Créons un setup.py pour cela avec le contenu suivant:



from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize('test2.pyx'))


Et collectez:



python setup.py build_ext --inplace


Prenons maintenant le fichier du message mentionné avec des tests et corrigeons-le un peu en ajoutant la possibilité de saisir votre propre numéro au début (tests.py):



import test
import test2
import time

number = input('enter number: ')

start = time.time()
test.test(number)
end =  time.time()

py_time = end - start
print("Python time = {}".format(py_time))

start = time.time()
test2.test(number)
end =  time.time()

cy_time = end - start
print("Cython time = {}".format(cy_time))
print("Speedup = {}".format(py_time / cy_time))


Voyons ce qui se passe:



python tests.py


Résultats:



Pour python 2.7:

enter number: 10
Python time = 1.62124633789e-05
Cython time = 4.05311584473e-06
Speedup = 4.0

enter number: 100
Python time = 3.40938568115e-05
Cython time = 5.00679016113e-06
Speedup = 6.80952380952

enter number: 1000
Python time = 0.000224113464355
Cython time = 1.19209289551e-05
Speedup = 18.8

enter number: 100000
Python time = 0.0200171470642
Cython time = 0.000855922698975
Speedup = 23.3866295265




Pour python 3:



enter number: 10
Python time = 7.653236389160156e-05
Cython time = 2.8133392333984375e-05
Speedup = 2.7203389830508473

enter number: 100
Python time = 8.678436279296875e-05
Cython time = 3.170967102050781e-05
Speedup = 2.736842105263158

enter number: 1000
Python time = 0.00031876564025878906
Cython time = 4.673004150390625e-05
Speedup = 6.821428571428571

enter number: 100000
Python time = 0.01643967628479004
Cython time = 0.0004260540008544922
Speedup = 38.5858981533296




* le module test2.pyx a été "reconstruit" avec la commande:

python3 setup.py build_ext --inplace

** installé par cython:

pip3 install cython



Vous pouvez vous passer de la construction de test2.pyx en utilisant setup.py, pour cela il vous suffit d'ajouter les lignes au fichier tests.py :



import pyximport
pyximport.install()


Désormais, test2.pyx sera construit à la volée chaque fois que tests.py est exécuté, et il y aura moins de fichiers dans le dossier.



Comment démarrer cython sous Windows.



Malgré le fait que cython autorise l'assemblage de fichiers pour python3 et python2, il n'a pas été possible d' obtenir une recette toute faite pour python3 .

Avec python3, la commande build fonctionne:

python setup.py build_ext -i --compiler=msvc


Cependant, pour son travail à part entière, vous devez installer une partie des composants de Visual Studio 2019. Ce qu'il faut installer exactement est indiqué dans la solution ici .



Par conséquent, il existe deux options de travail qui vous permettent de travailler (créer un fichier) dans Windows avec cython.



Le premier utilise python2.7 et le compilateur mingw.

La procédure est la suivante.

1.Installez cython lui-même sous python2.7:

py -2 -m pip install cython


2. Installez le compilateur mingw:

mingw

3. Après avoir installé le compilateur et l'avoir ajouté aux fenêtres PATH, le fichier .pyx peut être compilé avec la commande:

python setup.py build_ext -i --compiler=mingw32


La seconde utilise python3.x et le compilateur msvc.



Comment exécuter cython dans le notebook jupyter.



Parfois, il est nécessaire de tester visuellement le travail du code à l'aide de jupyter. Afin de ne pas compiler le code en cmd à chaque fois, vous pouvez utiliser cython directement dans les cellules jupyter.

Pour ce faire, importez cython en l'exécutant dans la cellule jupyter:

%load_ext cython


Et exécutons du code dans la cellule suivante:

%%cython -a
import numpy as np

cdef int max(int a, int b):
    return a if a > b else b

cdef int chebyshev(int x1, int y1, int x2, int y2):
    return max(abs(x1 - x2), abs(y1 - y2))

def c_benchmark():
    a = np.random.rand(1000, 2)
    b = np.random.rand(1000, 2)
    
    for x1, y1 in a:
        for x2, y2 in b:
            chebyshev(x1, x2, y1, y2)


Si tout réussit, la sortie sera comme ceci:




All Articles