[PYTHON] Profilage de lignes avec Cython

Aperçu

Comment aligner le profil dans la fonction " cdef "dans le code Cython" * .pyx"

1. Installation de la bibliothèque

pip install line_profiler

2. Modification du fichier pyx

2.1. Ajout de la déclaration de profil de ligne au début du fichier

Définir la déclaration de profil comme ligne de commentaire au début du fichier pyx

Changer avant)

# -*- coding: utf-8 -*-
#
import math
...

Après changement)

# -*- coding: utf-8 -*-
#
# cython: profile=True
# cython: linetrace=True
# cython: binding=True
# distutils: define_macros=CYTHON_TRACE_NOGIL=1
import math
...

2.2. Décorateur de profil d'appel

Puisque cdef ne peut pas avoir de décorateur de fonction, placez la fonction que vous voulez appeler dans le profil.

Changer avant)

a = funca(a1, a2)

funcb(a, b1)

Après changement)

pfa = profile(funca)
a = pfa(a1, a2)

pfb = profile(funcb)
pfb(a, b1)

2.3. Changer la fonction cdef en fonction cpdef

Si la fonction cdef reste, stringsource.wrap entraînera une erreur.

Changer avant)

cdef funca(a1, a2):
    return a1 * a2

Après changement)

cpdef funca(a1, a2):
    return a1 * a2

3. Modifiez setup.py

3.1. Ajout de paramètres d'extension

Changer avant)

       Extension("service.AService", sources=["service/AService.pyx"], include_dirs=['.']), 

Après changement)

       Extension("service.AService", sources=["service/AService.pyx"], include_dirs=['.'], define_macros=[('CYTHON_TRACE', '1')]), 

3.2. Modifications apportées à cythonize

setup(name="*", cmdclass={"build_ext": build_ext}, ext_modules=cythonize(setup_ext.ext, annotate=True, \
      compiler_directives={'language_level': "3"}))

Après changement)

setup(name="*", cmdclass={"build_ext": build_ext}, ext_modules=cythonize(setup_ext.ext, annotate=True, \
      compiler_directives={'language_level': "3", 'profile': True, 'linetrace': True, 'binding': True}))

4. Compilez

Appelez kernprof au moment de la compilation setup.py

kernprof -l setup.py build_ext --inplace

5. Exécution du profil

kernprof -l -v executor.py

résultat

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
   503                                               cpdef dict prepare_avoidance_dataset(self, int data_set_idx, str direction):
   504         2      29445.0  14722.5      0.1          logger.info("Préparation pour éviter les contacts [Non.%s - %s】", (data_set_idx + 1), direction)
   505
   506                                                   cdef int aidx, fno, from_fno, prev_block_fno, to_fno
   507                                                   cdef float block_x_distance, block_z_distance, x_distance, z_distance
   508                                                   cdef list all_avoidance_list, fnos, prev_collisions
   509                                                   cdef dict all_avoidance_axis, rep_avbone_global_3ds, rep_avbone_global_mats, rep_global_3ds, rep_matrixs, avoidance_list
   510                                                   cdef str avoidance_name, bone_name
   511                                                   cdef bint collision, near_collision
   512                                                   cdef BoneLinks arm_link, avodance_link
   513                                                   cdef ArmAvoidanceOption avoidance_options
   514                                                   cdef MOptionsDataSet data_set
   515                                                   cdef OBB obb
   516                                                   cdef RigidBody avoidance
   517                                                   cdef MVector3D rep_x_collision_vec, rep_z_collision_vec
   518
   519         2       1638.0    819.0      0.0          logger.copy(self.options)
   520                                                   #Ensemble de données à traiter
   521         2         29.0     14.5      0.0          data_set = self.options.data_set_list[data_set_idx]
   522

(Abréviation)

Nettoyer

Remettre le code après le profilage

Recommended Posts

Profilage de lignes avec Cython
Utiliser Cython avec Jupyter Notebook
Gérer numpy avec Cython (méthode par memoryview)
Objet de tampon de tableau pouvant être utilisé avec Cython