-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcProfile_Numpy.py
36 lines (28 loc) · 2.29 KB
/
cProfile_Numpy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import ctypes # Librería para acceder a bibliotecas/herramientas de bajo nivel escritas en C
import numpy as np # Librería de Python para operaciones matemáticas avanzadas y estructuras de datos eficientes
import cProfile # Librería para realizar perfiles de código y medir el tiempo de ejecución de las funciones
import pstats # Librería para procesar y mostrar estadísticas de los perfiles realizados
# Cargar la librería dinámica que contiene la función de multiplicación vector-escalar escrita en C
lib = ctypes.CDLL("/home/kvelez/Documentos/Profiling y AVX/libMultEscalar.so")
# Especificar los tipos de argumentos y el tipo de retorno de la función vectorScalarMultiply en la librería dinámica
lib.vectorScalarMultiply.argtypes = [ctypes.POINTER(ctypes.c_double), ctypes.c_double,
ctypes.POINTER(ctypes.c_double), ctypes.c_int]
lib.vectorScalarMultiply.restype = None
def vector_scalar_multiply(vector, scalar):
length = len(vector)
result = np.empty(length, dtype=np.float64) # Crear un array en numpy para almacenar el resultado de la multiplicación
lib.vectorScalarMultiply((ctypes.c_double * len(vector))(*vector), scalar,
result.ctypes.data_as(ctypes.POINTER(ctypes.c_double)), length) # Llamar a la función de la librería dinámica
return result
# Generar un vector de tamaño 10 millones utilizando la librería numpy
vector = np.arange(1, 10000001, dtype=np.float64) # Crear un vector de números de 1 a 10000000
scalar = 2.0 # Valor escalar para la multiplicación
# Ejecutar el código dentro del contexto del perfilador cProfile para medir el tiempo de ejecución
pr = cProfile.Profile() # Inicializar un perfilador
# Ejecutar la función de multiplicación vector-escalar con el contexto de cProfile para medir el tiempo
pr.enable() # Iniciar la medición de tiempo
vector_scalar_multiply(vector, scalar) # Llamar a la función de multiplicación
pr.disable() # Terminar la medición de tiempo
# Obtener las estadísticas y limitar la impresión a las 10 líneas con mayor tiempo acumulado
stats = pstats.Stats(pr).strip_dirs().sort_stats("cumtime") # Crear estadísticas basadas en el perfil
stats.print_stats(10) # Imprimir las 10 líneas con mayor tiempo acumulado