So zeichnen Sie ein Profil innerhalb der Funktion " cdef
"im Cython-Code" * .pyx
"
pip install line_profiler
Legen Sie die Profildeklaration als Kommentarzeile am Anfang der Pyx-Datei fest
Vorher ändern)
# -*- coding: utf-8 -*-
#
import math
...
Nach der veränderung)
# -*- coding: utf-8 -*-
#
# cython: profile=True
# cython: linetrace=True
# cython: binding=True
# distutils: define_macros=CYTHON_TRACE_NOGIL=1
import math
...
Da cdef
keinen Funktionsdekorator haben kann, fügen Sie die Funktion, die Sie aufrufen möchten, dem Profil bei.
Vorher ändern)
a = funca(a1, a2)
funcb(a, b1)
Nach der veränderung)
pfa = profile(funca)
a = pfa(a1, a2)
pfb = profile(funcb)
pfb(a, b1)
Wenn die Funktion "cdef" erhalten bleibt, führt "stringsource.wrap" zu einem Fehler.
Vorher ändern)
cdef funca(a1, a2):
return a1 * a2
Nach der veränderung)
cpdef funca(a1, a2):
return a1 * a2
Vorher ändern)
Extension("service.AService", sources=["service/AService.pyx"], include_dirs=['.']),
Nach der veränderung)
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"}))
Nach der veränderung)
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}))
Rufen Sie zum Zeitpunkt der Kompilierung von setup.py kernprof auf
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("Vorbereitung zur Kontaktvermeidung [Nr.%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 #Zu verarbeitender Datensatz
521 2 29.0 14.5 0.0 data_set = self.options.data_set_list[data_set_idx]
522
(Abkürzung)
Setzen Sie den Code nach der Profilerstellung zurück