<p>¿La implementación de numpy.vectorize es esencialmente un bucle for?</p>

Creado en 6 jul. 2020  ·  5Comentarios  ·  Fuente: numpy/numpy

https://numpy.org/doc/1.18/reference/generated/numpy.vectorize.html
Este tutorial menciona que la implementación de vectorize es esencialmente un bucle for. Pero hasta donde yo sé, una función vectorizada usará
SIMD, entonces, ¿es correcto decir que la implementación de numpy.vectorize es esencialmente un bucle for? Si es cierto, ¿es más rápido que la función no vectorizada solo porque está implementado en un bucle en lenguaje C?

Muchas gracias de antemano.

33 - Question

Comentario más útil

Si. En el contexto de lenguajes de programación de matriz numérica interpretados como Python (con numpy) y MATLAB ™, a menudo usamos "vectorización" para referirnos a reemplazar bucles explícitos en el lenguaje de programación interpretado con una función (u operador) que se encarga de todos los bucle de lógica internamente. En numpy, los ufunc s implementan esta lógica. Esto no está relacionado con el uso de "vectorización" para referirse al uso de instrucciones de CPU SIMD que calculan sobre múltiples entradas al mismo tiempo, excepto que ambos usan una metáfora similar: son como sus contrapartes "escalares", pero realizan el cálculo sobre múltiples valores de entrada con una sola invocación.

Con numpy.vectorize() , generalmente no hay mucho beneficio de velocidad sobre el ciclo explícito de Python for . El punto principal es convertir la función de Python en un ufunc , que implementa toda la semántica de transmisión y, por lo tanto, se ocupa de cualquier tamaño de entradas. La función de Python que está siendo "vectorizada" todavía ocupa la mayor parte del tiempo, además de convertir el valor bruto de cada elemento en un objeto de Python para pasar a la función. No esperaría que np.vectorize(lambda x, y: x + y) sea ​​tan rápido como ufunc np.add , que es C tanto en el ciclo como en el contenido del ciclo.

Todos 5 comentarios

Si. En el contexto de lenguajes de programación de matriz numérica interpretados como Python (con numpy) y MATLAB ™, a menudo usamos "vectorización" para referirnos a reemplazar bucles explícitos en el lenguaje de programación interpretado con una función (u operador) que se encarga de todos los bucle de lógica internamente. En numpy, los ufunc s implementan esta lógica. Esto no está relacionado con el uso de "vectorización" para referirse al uso de instrucciones de CPU SIMD que calculan sobre múltiples entradas al mismo tiempo, excepto que ambos usan una metáfora similar: son como sus contrapartes "escalares", pero realizan el cálculo sobre múltiples valores de entrada con una sola invocación.

Con numpy.vectorize() , generalmente no hay mucho beneficio de velocidad sobre el ciclo explícito de Python for . El punto principal es convertir la función de Python en un ufunc , que implementa toda la semántica de transmisión y, por lo tanto, se ocupa de cualquier tamaño de entradas. La función de Python que está siendo "vectorizada" todavía ocupa la mayor parte del tiempo, además de convertir el valor bruto de cada elemento en un objeto de Python para pasar a la función. No esperaría que np.vectorize(lambda x, y: x + y) sea ​​tan rápido como ufunc np.add , que es C tanto en el ciclo como en el contenido del ciclo.

Gracias por su explicación detallada. Pero para ser claro, déjeme dar un ejemplo.

import pandas as pd
import numpy as np
df = pd.DataFrame({'a': range(100000), 'b': range(1, 1000001)})
# method1
df.loc[:, 'c'] = df.apply(lambda x: x['a'] + x['b'], axis=1)
# method2 
df.loc[:, 'c'] = np.vectorize(lambda x, y: x + y)(df['a'], df['b'])
# method3
df.loc[:, 'c'] = np.add(df['a'], df['b'])

así que con tu explicación, supongo

método | bucle en C | contenido de bucle en C | usar SIMD
- | - | - | -
1 | × | × | ×
2 | √ | × | ×
3 | √ | √ | √

¿Correcto?

np.add es más rápido que np.vectorize(lambda x, y: x + y) porque evita convertir dobles de C en objetos de Python y la sobrecarga de llamadas de función de Python. Es posible que también use instrucciones SIMD, dependiendo de si tiene o no las extensiones AVX2 , pero no por eso es más rápido.

np.add es más rápido que np.vectorize(lambda x, y: x + y) porque evita convertir dobles de C en objetos de Python y la sobrecarga de llamadas de función de Python. Es posible que _también_ use instrucciones SIMD, dependiendo de si tiene o no las extensiones AVX2 , pero no por eso es más rápido.

Lo tengo. Gracias.

Puede usar vectorize de numba para producir ufuncs que operan en paralelo sin los gastos generales de Python:

https://numba.pydata.org/numba-doc/latest/user/vectorize.html

¿Fue útil esta página
0 / 5 - 0 calificaciones