Comment aligner le profil dans la fonction " cdef
"dans le code Cython" * .pyx
"
pip install line_profiler
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
...
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)
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
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')]),
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}))
Appelez kernprof
au moment de la compilation setup.py
kernprof -l setup.py build_ext --inplace
kernprof -l -v executor.py
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)
Remettre le code après le profilage