<p>numpy.vectorize рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╣реИ?</p>

рдХреЛ рдирд┐рд░реНрдорд┐рдд 6 рдЬреБрд▓ре░ 2020  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: numpy/numpy

https://numpy.org/doc/1.18/reference/generated/numpy.vectorize.html
рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╣реИред рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдПрдХ рд╡реЗрдХреНрдЯрд░ рдлрдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛
SIMD, рддреЛ рдпрд╣ рдХрд╣рдирд╛ рд╕рд╣реА рд╣реИ рдХрд┐ numpy.vectorize рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╣реИ? рдЕрдЧрд░ рдпрд╣ рд╕рдЪ рд╣реИ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ unvectorized func рд╕реЗ рддреЗрдЬ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ C рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реВрдк рд╣реИ?

рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдБред рдкрд╛рдпрдерди (numpy рдХреЗ рд╕рд╛рде) рдФрд░ MATLAB тДв рдЬреИрд╕реЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╣рдо рдЕрдХреНрд╕рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рдСрдкрд░реЗрдЯрд░) рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдЫреЛрд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП "рд╡реЗрдХреНрдЯрд░рдХрд░рдг" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрддреЗ рд╣реИрдВред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд▓реЙрдЬрд┐рдХред рд╕реБрдиреНрди рдореЗрдВ, ufunc s рдЗрд╕ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ SIMD CPU рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рд╡реИрд╢реНрд╡реАрдХрд░рдг" рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬреЛ рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдХрдИ рдЗрдирдкреБрдЯ рдкрд░ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рдПрдХ рд╕рдорд╛рди рд░реВрдкрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╡реЗ рдЕрдкрдиреЗ "рд╕реНрдХреЗрд▓рд░" рд╕рдордХрдХреНрд╖реЛрдВ рдХреА рддрд░рд╣ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдИ рдЗрдирдкреБрдЯ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдЕрднрд┐рдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ рдПрдХ рдПрдХрд▓ рдЖрд╣реНрд╡рд╛рди рдХреЗ рд╕рд╛рдеред

numpy.vectorize() , рдЖрдорддреМрд░ рдкрд░ рд╕реНрдкрд╖реНрдЯ рдкрд╛рдпрдерди for рд▓реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЧрддрд┐ рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рдХреЛ ufunc рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдкреНрд░рд╕рд╛рд░рд┐рдд рдЕрд░реНрде-рд╡рд┐рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдХреЗ рдЗрдирдкреБрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ "рд╡реЗрдХреНрдЯрд░рдХреГрдд" рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЙрд╕реЗ рдЕрднреА рднреА рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рдХрдЪреНрдЪреЗ рдореВрд▓реНрдп рдХреЛ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЖрдк np.vectorize(lambda x, y: x + y) ufunc np.add рд░реВрдк рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд▓реВрдк рдФрд░ рд▓реВрдк рдХреА рд╕рд╛рдордЧреНрд░реА рджреЛрдиреЛрдВ рдореЗрдВ рд╕реА рд╣реИред

рд╕рднреА 5 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдБред рдкрд╛рдпрдерди (numpy рдХреЗ рд╕рд╛рде) рдФрд░ MATLAB тДв рдЬреИрд╕реЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╣рдо рдЕрдХреНрд╕рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рдСрдкрд░реЗрдЯрд░) рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдЫреЛрд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП "рд╡реЗрдХреНрдЯрд░рдХрд░рдг" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрддреЗ рд╣реИрдВред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд▓реЙрдЬрд┐рдХред рд╕реБрдиреНрди рдореЗрдВ, ufunc s рдЗрд╕ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ SIMD CPU рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рд╡реИрд╢реНрд╡реАрдХрд░рдг" рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬреЛ рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдХрдИ рдЗрдирдкреБрдЯ рдкрд░ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рдПрдХ рд╕рдорд╛рди рд░реВрдкрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╡реЗ рдЕрдкрдиреЗ "рд╕реНрдХреЗрд▓рд░" рд╕рдордХрдХреНрд╖реЛрдВ рдХреА рддрд░рд╣ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдИ рдЗрдирдкреБрдЯ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдЕрднрд┐рдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ рдПрдХ рдПрдХрд▓ рдЖрд╣реНрд╡рд╛рди рдХреЗ рд╕рд╛рдеред

numpy.vectorize() , рдЖрдорддреМрд░ рдкрд░ рд╕реНрдкрд╖реНрдЯ рдкрд╛рдпрдерди for рд▓реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЧрддрд┐ рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рдХреЛ ufunc рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдкреНрд░рд╕рд╛рд░рд┐рдд рдЕрд░реНрде-рд╡рд┐рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдХреЗ рдЗрдирдкреБрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ "рд╡реЗрдХреНрдЯрд░рдХреГрдд" рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЙрд╕реЗ рдЕрднреА рднреА рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рдХрдЪреНрдЪреЗ рдореВрд▓реНрдп рдХреЛ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЖрдк np.vectorize(lambda x, y: x + y) ufunc np.add рд░реВрдк рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд▓реВрдк рдФрд░ рд▓реВрдк рдХреА рд╕рд╛рдордЧреНрд░реА рджреЛрдиреЛрдВ рдореЗрдВ рд╕реА рд╣реИред

рдЖрдкрдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддрд╛ рд╣реВрдВред

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

рддреЛ рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ

рд╡рд┐рдзрд┐ | C рдореЗрдВ рд▓реВрдк | рд╕реА рдореЗрдВ рдкрд╛рд╢ рд╕рд╛рдордЧреНрд░реА | SIMD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
- | - | - | -
1 | ├Ч | ├Ч | ├Ч
2 | тИЪ | ├Ч | ├Ч
3 | тИЪ | тИЪ | тИЪ

рд╕рд╣реА?

np.add np.vectorize(lambda x, y: x + y) рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬрд╝ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ C рдпреБрдЧрд▓ рдХреЛ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдУрд╡рд░рд╣реЗрдбред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рднреА AVD2 рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ SIMD рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реАрд▓рд┐рдП рдпрд╣ рддреЗрдЬ рдирд╣реАрдВ рд╣реИред

np.add np.vectorize(lambda x, y: x + y) рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬрд╝ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ C рдпреБрдЧрд▓ рдХреЛ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдУрд╡рд░рд╣реЗрдбред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ _also_ SIMD рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ AVX2 рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреЗрдЬ рд╣реИред

рдореИрдВ рд╕рдордЭ рдЧрдпрд╛ред рдзрдиреНрдпрд╡рд╛рджред

рдЖрдк рд╕реБрдерд░рд╛ рдХреЗ vectorize рдХрд╛ рдЙрдкрдпреЛрдЧ ufuncs рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рдпрдерди рдУрд╡рд░рд╣реЗрдбреНрд╕ рдХреЗ рдмрд┐рдирд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:

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

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕