<p>Implementasi numpy.vectorize pada dasarnya adalah for loop?</p>

Dibuat pada 6 Jul 2020  ·  5Komentar  ·  Sumber: numpy/numpy

https://numpy.org/doc/1.18/reference/generated/numpy.vectorize.html
Tutorial ini menyebutkan bahwa implementasi vectorize pada dasarnya adalah for loop. Tapi sejauh yang saya tahu, fungsi vektorisasi akan digunakan
SIMD, jadi apakah akurat untuk mengatakan implementasi numpy.vectorize pada dasarnya adalah for loop? Jika benar, jadi lebih cepat daripada func yang tidak divektorisasi hanya karena loopnya diimplementasikan dalam bahasa C?

Terima kasih banyak sebelumnya.

33 - Question

Komentar yang paling membantu

Iya. Dalam konteks bahasa pemrograman larik numerik yang ditafsirkan seperti Python (dengan numpy) dan MATLAB ™, kami sering menggunakan "vektorisasi" untuk merujuk pada penggantian loop eksplisit dalam bahasa pemrograman yang ditafsirkan dengan fungsi (atau operator) yang menangani semua logika perulangan secara internal. Dalam numpy, ufunc s mengimplementasikan logika ini. Ini tidak terkait dengan penggunaan "vektorisasi" untuk merujuk pada penggunaan instruksi CPU SIMD yang menghitung melalui beberapa input secara bersamaan, kecuali bahwa keduanya menggunakan metafora yang serupa: keduanya seperti rekan "skalar", tetapi melakukan komputasi pada beberapa nilai input dengan satu doa.

Dengan numpy.vectorize() , biasanya tidak ada banyak keuntungan kecepatan dibandingkan pengulangan eksplisit Python for . Poin utamanya adalah mengubah fungsi Python menjadi ufunc , yang mengimplementasikan semua semantik penyiaran dan dengan demikian menangani berbagai ukuran input. Fungsi Python yang sedang "vektorisasi" masih memakan sebagian besar waktu, serta mengonversi nilai mentah setiap elemen ke objek Python untuk diteruskan ke fungsi. Anda tidak akan mengharapkan np.vectorize(lambda x, y: x + y) secepat ufunc np.add , yang merupakan C baik dalam perulangan maupun isi perulangan.

Semua 5 komentar

Iya. Dalam konteks bahasa pemrograman larik numerik yang ditafsirkan seperti Python (dengan numpy) dan MATLAB ™, kami sering menggunakan "vektorisasi" untuk merujuk pada penggantian loop eksplisit dalam bahasa pemrograman yang ditafsirkan dengan fungsi (atau operator) yang menangani semua logika perulangan secara internal. Dalam numpy, ufunc s mengimplementasikan logika ini. Ini tidak terkait dengan penggunaan "vektorisasi" untuk merujuk pada penggunaan instruksi CPU SIMD yang menghitung melalui beberapa input secara bersamaan, kecuali bahwa keduanya menggunakan metafora yang serupa: keduanya seperti rekan "skalar", tetapi melakukan komputasi pada beberapa nilai input dengan satu doa.

Dengan numpy.vectorize() , biasanya tidak ada banyak keuntungan kecepatan dibandingkan pengulangan eksplisit Python for . Poin utamanya adalah mengubah fungsi Python menjadi ufunc , yang mengimplementasikan semua semantik penyiaran dan dengan demikian menangani berbagai ukuran input. Fungsi Python yang sedang "vektorisasi" masih memakan sebagian besar waktu, serta mengonversi nilai mentah setiap elemen ke objek Python untuk diteruskan ke fungsi. Anda tidak akan mengharapkan np.vectorize(lambda x, y: x + y) secepat ufunc np.add , yang merupakan C baik dalam perulangan maupun isi perulangan.

Terima kasih atas penjelasan rinci Anda. Tapi untuk lebih jelasnya, izinkan saya mengambil contoh.

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

jadi dengan penjelasan Anda, saya kira

metode | loop di C | konten loop di C | gunakan SIMD
- | - | - | -
1 | × | × | ×
2 | √ | × | ×
3 | √ | √ | √

Baik?

np.add lebih cepat dari np.vectorize(lambda x, y: x + y) karena ini menghindari konversi ganda C menjadi objek Python dan overhead pemanggilan fungsi Python. Mungkin saja itu juga menggunakan instruksi SIMD, tergantung pada apakah Anda memiliki ekstensi AVX2 atau tidak, tetapi bukan itu alasannya lebih cepat.

np.add lebih cepat dari np.vectorize(lambda x, y: x + y) karena ini menghindari konversi ganda C menjadi objek Python dan overhead pemanggilan fungsi Python. Ada kemungkinan bahwa itu _juga_ menggunakan instruksi SIMD, tergantung pada apakah Anda memiliki ekstensi AVX2 atau tidak, tetapi bukan itu alasannya lebih cepat.

Saya mendapatkannya. Terima kasih.

Anda dapat menggunakan vectorize dari numba untuk menghasilkan ufunc yang beroperasi secara paralel tanpa overhead Python:

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

kevinzhai80 picture kevinzhai80  ·  4Komentar

qualiaa picture qualiaa  ·  3Komentar

navytux picture navytux  ·  4Komentar

marcocaccin picture marcocaccin  ·  4Komentar

manuels picture manuels  ·  3Komentar