<p>РСализация numpy.vectorize ΠΏΠΎ сути являСтся Ρ†ΠΈΠΊΠ»ΠΎΠΌ for?</p>

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 6 июл. 2020  Β·  5ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: numpy/numpy

https://numpy.org/doc/1.18/reference/generated/numpy.vectorize.html
Π’ этом руководствС упоминаСтся, Ρ‡Ρ‚ΠΎ рСализация Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ сути являСтся Ρ†ΠΈΠΊΠ»ΠΎΠΌ for. Но насколько я знаю, вСкторизованная функция Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
SIMD, Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ рСализация numpy.vectorize ΠΏΠΎ сути являСтся Ρ†ΠΈΠΊΠ»ΠΎΠΌ for? Если true, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½ быстрСС Π½Π΅Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ†ΠΈΠΊΠ» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° языкС C?

Бпасибо Π·Π°Ρ€Π°Π½Π΅Π΅.

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π”Π°. Π’ контСкстС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языков программирования числовых массивов, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Python (с numpy) ΠΈ MATLAB β„’, ΠΌΡ‹ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Β«Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽΒ» для обозначСния Π·Π°ΠΌΠ΅Π½Ρ‹ явных Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ языкС программирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ), которая заботится ΠΎΠ±ΠΎ всСх внутрСнняя Π»ΠΎΠ³ΠΈΠΊΠ° Ρ†ΠΈΠΊΠ»Π°. Π’ numpy ufunc s Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ эту Π»ΠΎΠ³ΠΈΠΊΡƒ. Π­Ρ‚ΠΎ Π½Π΅ связано с использованиСм Β«Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈΒ» для обозначСния использования инструкций ЦП SIMD, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ ΠΏΠΎ нСскольким Π²Ρ…ΠΎΠ΄Π°ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ ΠΌΠ΅Ρ‚Π°Ρ„ΠΎΡ€Ρƒ: ΠΎΠ½ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° свои «скалярныС» Π°Π½Π°Π»ΠΎΠ³ΠΈ, Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ вычислСния ΠΏΠΎ нСскольким Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ значСниям с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°.

Π‘ numpy.vectorize() ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° Π² скорости ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с явным Ρ†ΠΈΠΊΠ»ΠΎΠΌ Python for . Π‘ΡƒΡ‚ΡŒ этого Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Python Π² ufunc , которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ всю сСмантику ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с Π»ΡŽΠ±Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Ѐункция Python, которая «вСкторизуСтся», ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ значСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Python для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Ρ‹ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ np.vectorize(lambda x, y: x + y) Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ быстрым, ΠΊΠ°ΠΊ ufunc np.add , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся C ΠΊΠ°ΠΊ Π² Ρ†ΠΈΠΊΠ»Π΅, Ρ‚Π°ΠΊ ΠΈ Π² содСрТимом Ρ†ΠΈΠΊΠ»Π°.

ВсС 5 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π”Π°. Π’ контСкстС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языков программирования числовых массивов, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Python (с numpy) ΠΈ MATLAB β„’, ΠΌΡ‹ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Β«Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽΒ» для обозначСния Π·Π°ΠΌΠ΅Π½Ρ‹ явных Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ языкС программирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ), которая заботится ΠΎΠ±ΠΎ всСх внутрСнняя Π»ΠΎΠ³ΠΈΠΊΠ° Ρ†ΠΈΠΊΠ»Π°. Π’ numpy ufunc s Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ эту Π»ΠΎΠ³ΠΈΠΊΡƒ. Π­Ρ‚ΠΎ Π½Π΅ связано с использованиСм Β«Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈΒ» для обозначСния использования инструкций ЦП SIMD, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ ΠΏΠΎ нСскольким Π²Ρ…ΠΎΠ΄Π°ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ ΠΌΠ΅Ρ‚Π°Ρ„ΠΎΡ€Ρƒ: ΠΎΠ½ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° свои «скалярныС» Π°Π½Π°Π»ΠΎΠ³ΠΈ, Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ вычислСния ΠΏΠΎ нСскольким Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ значСниям с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°.

Π‘ numpy.vectorize() ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° Π² скорости ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с явным Ρ†ΠΈΠΊΠ»ΠΎΠΌ Python for . Π‘ΡƒΡ‚ΡŒ этого Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Python Π² ufunc , которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ всю сСмантику ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с Π»ΡŽΠ±Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Ѐункция Python, которая «вСкторизуСтся», ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ значСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Python для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Ρ‹ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ np.vectorize(lambda x, y: x + y) Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ быстрым, ΠΊΠ°ΠΊ ufunc np.add , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся C ΠΊΠ°ΠΊ Π² Ρ†ΠΈΠΊΠ»Π΅, Ρ‚Π°ΠΊ ΠΈ Π² содСрТимом Ρ†ΠΈΠΊΠ»Π°.

Бпасибо Π·Π° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ объяснСниС. Но для ясности ΠΏΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ привСсти ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

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 | содСрТаниС Ρ†ΠΈΠΊΠ»Π° Π² C | ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ SIMD
- | - | - | -
1 | Γ— | Γ— | Γ—
2 | √ | Γ— | Γ—
3 | √ | √ | √

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ?

np.add быстрСС, Ρ‡Π΅ΠΌ np.vectorize(lambda x, y: x + y) ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ прСобразования Π΄Π²ΠΎΠΉΠ½ΠΈΠΊΠΎΠ² C Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Python ΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Python. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ инструкции SIMD, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ , Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ

np.add быстрСС, Ρ‡Π΅ΠΌ np.vectorize(lambda x, y: x + y) ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ прСобразования Π΄Π²ΠΎΠΉΠ½ΠΈΠΊΠΎΠ² C Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Python ΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Python. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ½ _Ρ‚Π°ΠΊΠΆΠ΅_ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ инструкции SIMD, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ , Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ

Π― понял. Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€ΡŽ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ numba vectorize для создания ufunc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π±Π΅Π· Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Python:

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

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ