Kita telah mengenal keluarga numerik, bool, string, dan object, serta cara konversinya. Bab ini merangkum semuanya menjadi kerangka keputusan. Pertanyaannya bukan “tipe mana yang paling canggih”, melainkan “tipe mana yang cukup untuk data ini, tanpa membayar biaya yang tidak perlu”. Empat pertimbangan berikut bisa kita jalankan berurutan setiap kali membuat array baru.

1. Pastikan Rentangnya Cukup #

Langkah pertama selalu soal kebenaran data: pastikan semua nilai yang mungkin muncul muat dalam rentang tipe yang dipilih. Fungsi np.iinfo memberi batas bawah dan atas tiap tipe integer, sehingga pengecekannya bisa diotomatisasi. Contoh berikut mengecek apakah nilai penjualan dalam rupiah muat di int16.

python
import numpy as np

penjualan = np.array([15000, 27500, 99900])
print("Cukup int16:", penjualan.max() <= np.iinfo(np.int16).max)
print("Cukup int32:", penjualan.max() <= np.iinfo(np.int32).max)

Output yang Dihasilkan:

text
Cukup int16: False
Cukup int32: True

Hasilnya jelas: 99900 melebihi batas atas int16 (32767), sehingga memaksa data ke int16 akan menyebabkan overflow. int32 cukup untuk contoh ini; int64 tetap menjadi pilihan aman default karena rentangnya nyaris tidak pernah dilampaui oleh data bisnis sehari-hari.

2. Cek Kebutuhan Presisi #

Untuk nilai uang, presisi adalah persoalan kebenaran, bukan selera. float32 hanya menyimpan sekitar 7 angka desimal bermakna, sehingga rupiah dalam jumlah besar mulai terpotong. Bandingkan kedua tipe berikut pada nilai yang sama:

python
import numpy as np

harga32 = np.array([1000000.15, 2000000.25], dtype=np.float32)
harga64 = np.array([1000000.15, 2000000.25], dtype=np.float64)
print(harga32)
print(harga64)

Output yang Dihasilkan:

text
[1000000.1 2000000.2]
[1000000.15 2000000.25]

Dengan float32, sen pada harga rupiah juta-an tak terwakili lagi. Dua pilihan aman untuk uang:

  • Simpan sebagai integer satuan terkecil (misalnya sen atau rupiah bulat) dengan int64, lalu format menjadi desimal saat ditampilkan.
  • Pakai float64 dan terima galat representasi biner yang sangat kecil untuk kasus non-akuntansi.

3. Timbang Memori versus Kecepatan #

Setelah kebenaran terjamin, baru kita bicara efisiensi. Tipe yang lebih kecil menghemat memori dan membuat data lebih muat di cache, tetapi konversi bolak-balik tipe justru memakan waktu. Cara cepat menakar konsumsi memori adalah atribut nbytes.

python
import numpy as np

bentuk = (1000, 1000)
for t in [np.int64, np.int32, np.float32]:
    arr = np.zeros(bentuk, dtype=t)
    print(t.__name__, arr.nbytes, "byte")

Output yang Dihasilkan:

text
int64 8000000 byte
int32 4000000 byte
float32 4000000 byte

Satu juta elemen int64 memakan 8 MB; turun ke int32 atau float32 memangkasnya menjadi 4 MB. Penghematan ini berarti hanya bila rentang dan presisi int32/float32 memang cukup untuk data tersebut. Tabel berikut merangkum rekomendasi untuk situasi yang umum:

SituasiRekomendasi dtypeAlasan
Piksel gambar (0-255)uint8Rentang pas dan hemat 8x dibanding int64
Harga, stok, hitungan bisnisint64Rentang luas; overflow praktis mustahil
Data ilmiah umumfloat64Presisi tinggi; menjadi tipe bawaan NumPy
Dataset raksasa (ratusan juta sel)int32/float32Hemat memori, asalkan rentang dan presisi cukup
Penanda lulus/gagal, flagbool1 byte per elemen, langsung siap untuk indexing
Teks variatif (nama, catatan)pandas/PythonString NumPy berlebar tetap dan berisiko truncation

4. Perhatikan Interaksi dengan Library Lain #

Tipe data yang kita pilih tidak hidup sendirian. pandas, matplotlib, dan scikit-learn secara bawaan mengharapkan float64 untuk data numerik; array int32 atau float32 biasanya tetap diterima, tetapi bisa dikonversi ulang di belakang layar sehingga penghematan tadi berganti menjadi biaya konversi. Jika alur kerja kita berujung di library tersebut, memakai float64 sejak awal sering kali justru paling sederhana.

Kaidah praktisnya: konversi tipe hanya pada batas sistem (boundary), yaitu saat data masuk dari berkas atau keluar ke laporan. Di tengah alur komputasi, pertahankan satu tipe yang konsisten.

Sebagai penutup section ini, kerangka empat langkah di atas cukup diingat sebagai urutan: rentang dulu, presisi kedua, memori ketiga, kompatibilitas keempat. Dengan urutan itu, keputusan dtype menjadi prosedur yang bisa diulang, bukan tebakan.