Vektorisasi vs Loop di Pandas: Mana Lebih Cepat
TL;DR
Vektorisasi di pandas ngerjain operasi ke seluruh kolom sekaligus, dan biasanya puluhan sampai ratusan kali lebih cepat daripada loop baris per baris kayak iterrows. Ubah aritmetika antar kolom jadi operasi kolom langsung, dan logika kondisi jadi np.where atau np.select. Loop cuma masuk akal buat proses yang nggak bisa divektorkan, misalnya manggil API per baris.
Vektorisasi di pandas ngerjain operasi ke seluruh kolom sekaligus tanpa nulis loop. Buat data besar, cara ini hampir selalu lebih cepat daripada looping baris satu-satu, sering puluhan sampai ratusan kali lipat.
Kalau kamu pernah nulis for loop buat ngisi kolom baru di DataFrame terus nunggu lama, ini biang keladinya. Loop Python mroses satu baris tiap putaran. Vektorisasi nyerahin kerjaan ke kode C di balik pandas dan NumPy.
Ada satu kasus di mana loop masih masuk akal. Tapi buat mayoritas kerjaan harian, vektorisasi jadi pilihan default.
Apa itu vektorisasi di pandas?
Vektorisasi adalah cara ngejalanin operasi ke satu kolom penuh dalam sekali panggil, bukan baris per baris. Kamu nulis df['total'] = df['qty'] * df['harga'], dan pandas ngitung semua baris sekaligus di level C. Nggak ada loop Python yang jalan di belakangnya.
Hasilnya lebih pendek ditulis dan jauh lebih cepat dieksekusi. Ini teknik dasar data transformation yang kepakai tiap hari.
Kenapa loop di pandas lambat?
Loop lambat karena tiap putaran ngeluarin ongkos. Python ngecek tipe data, ngambil nilai per baris, dan bikin object baru tiap iterasi. Di 100.000 baris, ongkos itu numpuk. Vektorisasi ngelewatin semua itu dengan mroses array sekaligus.
Metode iterrows() paling sering jadi tersangka. Tiap baris diubah jadi Series dulu, dan itu mahal.
# Cara lambat: loop pakai iterrows
total = []
for idx, row in df.iterrows():
total.append(row['qty'] * row['harga'])
df['total'] = total
Kode di atas jalan, tapi boros. Versi vektornya cuma satu baris:
# Cara cepat: vektorisasi
df['total'] = df['qty'] * df['harga']
Vektorisasi vs loop: berapa beda kecepatannya?
Selisihnya gede. Di 100.000 baris, operasi kali dua kolom pakai iterrows bisa makan sekitar 3 detik. Versi vektornya kelar di bawah 5 milidetik. Itu sekitar 600 kali lebih cepat buat hasil yang sama persis.
| Metode | Waktu (100.000 baris) | Relatif |
|---|---|---|
| iterrows() | ~3.000 ms | 1x (paling lambat) |
| apply(axis=1) | ~900 ms | ~3x lebih cepat |
| list comprehension | ~80 ms | ~37x |
| vektorisasi (kolom) | ~5 ms | ~600x |
Angka pastinya beda-beda tergantung mesin dan jenis operasi. Tapi urutannya konsisten: vektor paling cepat, iterrows paling lambat. apply ada di tengah, lebih rapi dari loop tapi masih jauh dari vektor.
Gimana cara ubah loop jadi vektorisasi?
Kebanyakan loop bisa diganti operasi kolom langsung. Ikutin pola ini:
- Operasi aritmetika antar kolom cukup ditulis biasa:
df['a'] + df['b']. - Logika kondisi pakai
np.whereataunp.select, bukan if di dalam loop. - Operasi teks pakai accessor
.str, misalnyadf['kota'].str.upper(). - Operasi tanggal pakai accessor
.dtsetelah kolomnya jadi datetime.
Contoh logika kondisi. Misalnya mau kasih label transaksi besar di atas Rp1 juta:
import numpy as np
# Cara lambat: if di dalam loop
# for idx, row in df.iterrows():
# if row['total'] > 1_000_000: ...
# Cara cepat: np.where
df['label'] = np.where(df['total'] > 1_000_000, 'besar', 'kecil')
Buat lebih dari dua kondisi, np.select lebih rapi:
kondisi = [
df['total'] > 1_000_000,
df['total'] > 500_000,
]
label = ['besar', 'sedang']
df['label'] = np.select(kondisi, label, default='kecil')
Operasi tanggal juga sama gampangnya begitu kolomnya udah jadi datetime pakai pd.to_datetime.
Kapan loop masih masuk akal?
Loop masih wajar kalau tiap baris butuh proses yang nggak bisa divektorkan. Contohnya manggil API per baris, baca file eksternal, atau logika berurutan yang hasil baris sekarang bergantung ke baris sebelumnya di luar pola cumulative bawaan pandas.
Buat kasus berurutan sederhana, sering masih ada jalan vektor kayak cumsum, cumprod, atau shift. Cek dulu sebelum nyerah ke loop.
Contoh kasus: margin 50.000 transaksi Toko Berkah
Toko Berkah, UMKM kelontong di dataset latihan ngulikdata, punya 50.000 baris transaksi dengan kolom qty, harga_jual, dan harga_modal. Tugasnya ngitung margin per transaksi lalu kasih label sehat atau tipis.
Versi iterrows makan waktu 2,1 detik di laptopku. Versi vektor kelar di 12 milidetik. Selisihnya 175 kali, buat hasil yang identik.
df['margin'] = (df['harga_jual'] - df['harga_modal']) * df['qty']
df['status'] = np.where(
df['margin'] > 0.2 * df['harga_jual'] * df['qty'],
'sehat', 'tipis')
Temuan sampingannya menarik. Dari 50.000 transaksi, 18% masuk kategori margin tipis, dan hampir semuanya produk rokok. Kalau tiap eksplorasi pakai iterrows, tiap percobaan nambah 2 detik nunggu. Vektorisasi bikin kamu bisa ngulik angka tanpa mikirin waktu tunggu.
Kesalahan umum
1. Pakai iterrows buat operasi yang bisa divektorkan
Ini paling sering. Kalau isi loop cuma aritmetika atau kondisi antar kolom, ganti ke operasi kolom atau np.where.
2. Append ke DataFrame di dalam loop
Nambah baris satu-satu ke DataFrame bikin pandas nyalin ulang seluruh data tiap iterasi. Kumpulin ke list dulu, baru bikin DataFrame sekali di akhir.
3. Lupa import numpy buat np.where
np.where dan np.select butuh import numpy as np. Lupa ini bikin NameError.
4. Ngira apply itu vektorisasi
apply(axis=1) keliatan rapi tapi tetap jalan per baris di balik layar. Dia bukan vektorisasi sungguhan. Pakai cuma kalau operasi kolom langsung nggak memungkinkan.
Buat detail teknik percepatan lain, cek dokumentasi enhancing performance di pandas.
FAQ
Apa itu vektorisasi di pandas?
Vektorisasi itu cara ngejalanin operasi ke satu kolom penuh sekaligus, bukan baris per baris. Kamu tulis df['total'] = df['qty'] * df['harga'], dan pandas ngitung semua baris di level C tanpa loop Python. Hasilnya lebih pendek ditulis dan jauh lebih cepat, apalagi di data ratusan ribu baris.
Kenapa iterrows lambat banget?
iterrows ngubah tiap baris jadi object Series dulu sebelum kamu bisa akses nilainya. Pembuatan object itu mahal, dan diulang tiap baris. Di 100 ribu baris, ongkosnya numpuk jadi hitungan detik. Vektorisasi ngelewatin semua itu karena mroses seluruh array sekaligus, bukan satu-satu.
Apa apply sama dengan vektorisasi?
Nggak. apply(axis=1) tetap jalan baris per baris di balik layar, cuma sintaksnya lebih rapi dari loop manual. Dia lebih cepat dari iterrows tapi masih jauh lebih lambat dari operasi kolom langsung. Pakai apply cuma kalau logikanya nggak bisa ditulis sebagai operasi kolom atau np.where.
Kapan aku boleh pakai loop di pandas?
Loop wajar kalau tiap baris butuh proses yang nggak bisa divektorkan, misalnya manggil API, baca file per baris, atau logika berurutan yang rumit. Buat kasus berurutan sederhana, cek dulu fungsi kayak cumsum, shift, atau expanding sebelum nyerah ke loop.
Gimana cara ganti if-else di loop jadi vektor?
Buat dua kondisi, pakai np.where(kondisi, nilai_benar, nilai_salah). Buat lebih dari dua, pakai np.select dengan list kondisi dan list nilainya. Dua-duanya ngerjain logika ke seluruh kolom sekaligus, jadi jauh lebih cepat daripada nulis if di dalam for loop yang muter tiap baris.
Penutup
- Vektorisasi ngerjain operasi ke seluruh kolom sekaligus, dan biasanya ratusan kali lebih cepat dari iterrows.
- Ubah aritmetika jadi operasi kolom, logika kondisi jadi np.where atau np.select.
- Loop cuma buat kasus yang beneran nggak bisa divektorkan, kayak manggil API per baris.
Coba sekarang: ambil satu loop iterrows di kodemu, ukur waktunya, lalu tulis ulang jadi operasi kolom. Bandingin angkanya sendiri.
Mau lanjut? Baca pandas groupby buat ngagregasi data cepat tanpa loop.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.