[PYTHON] Zeilenprofilierung mit Cython

Überblick

So zeichnen Sie ein Profil innerhalb der Funktion " cdef "im Cython-Code" * .pyx"

1. Installieren der Bibliothek

pip install line_profiler

2. Änderung der Pyx-Datei

2.1. Linienprofildeklaration am Anfang der Datei hinzugefügt

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
...

2.2 Profildekorateur anrufen

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)

2.3. Ändern Sie die Funktion "cdef" in "cpdef"

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

3. Ändern Sie setup.py

3.1. Hinzufügen von Erweiterungsparametern

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')]), 

3.2. Änderungen an der Cythonisierung

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}))

4. Kompilieren

Rufen Sie zum Zeitpunkt der Kompilierung von setup.py kernprof auf

kernprof -l setup.py build_ext --inplace

5. Profilausführung

kernprof -l -v executor.py

Ergebnis

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)

Aufräumen

Setzen Sie den Code nach der Profilerstellung zurück

Recommended Posts

Zeilenprofilierung mit Cython
Verwenden Sie Cython mit Jupyter Notebook
Behandle numpy mit Cython (Methode von memoryview)
Array-Pufferobjekt, das mit Cython verwendet werden kann