Pentingnya Optimasi dalam Kode

June 13, 2020

Pendahuluan

Ketika kita mencoba memecahkan masalah dengan menggunakan kode, banyak sekali cara yang dapat digunakan agar masalah tersebut terpecahkan. Mulai dari cara yang umum hingga tidak umum. Ketika kita dihadapkan dengan penggunaan kode tersebut dalam skala besar, misalnya kode tersebut akan digunakan secara terus menerus dalam rentang waktu bersamaan. Kita perlu memikirkan apakah kode yang kita tulis sudah optimal atau belum? Maksud optimal disini adalah resource yang digunakan sedikit dan waktu yang dibutuhkan untuk komputasi sebentar. Proses untuk mengoptimalkan kode sehingga lebih efisien dalam penggunaan resource dan penggunaan waktu lebih cepat disebut dengan Optimasi.

Studi kasus

Studi kasus disini saya dapat dari Udacity. Pada soalnya diberikan dua file books_published_last_two_years.txt dan all_coding_books.txt yang berisi ids buku. Tugasnya adalah untuk menghitung berapa buku Coding yang muncul dua tahun terakhir.

Sampel isi file books_published_last_two_years.txt

1262771
9011996
2007022
9389522
8181760
9203790

Sampel isi file all_coding_books.txt

4140074
3058732
4181244
8709089
9097893
2606750

Kemudian import semua library yang dibutuhkan

import time
import pandas as pd
import numpy as np

Lalu read file dan simpan kedalam list recent_books dan coding_books

with open('books_published_last_two_years.txt') as f:
    recent_books = f.read().split('\n')
    
with open('all_coding_books.txt') as f:
    coding_books = f.read().split('\n')

Ketika membaca soal tersebut mungkin ide yang muncul adalah kita dapat melakukan looping pada recent_books lalu jika buku tersebut ada di coding_books kemudian simpan kedalam recent_coding_books

start = time.time()
recent_coding_books = []

for book in recent_books:
    if book in coding_books:
        recent_coding_books.append(book)

print(len(recent_coding_books))
print('Duration: {} seconds'.format(time.time() - start))

Hasil perhitungan dan waktu dari komputasinya didapatkan

96
Duration: 17.40716576576233 seconds

Artinya dibutuhkan 17 detik untuk mendapatkan total 96 buku koding 2 tahun terbaru pada file. Kita dapat melakukan peningkatan pada kecepatan komputasinya, jika kita berpikir lebih jauh, masalah diatas merupakan masalah irisan. Kita ditugaskan untuk mencari irisan antara dua data.

Sebelumnya kita sudah mengimport numpy. Pada numpy terdapat sebuah fungsi intersect1d dimana fungsi tersebut berfungsi untuk mencari irisan data.

start = time.time()
recent_coding_books = np.intersect1d(recent_books, coding_books)
print(len(recent_coding_books))
print('Duration: {} seconds'.format(time.time() - start))

Waktu yang dibutuhkan untuk komputasi proses diatas yaitu :

96
Duration: 0.04141545295715332 seconds

Bagaimana? lebih cepat bukan? kita hanya membutuhkan 0.04 sekon dari yang sebelumnya 17 sekon.

Sekarang kita coba untuk meningkatkan lagi kecepatannya yaitu berdasarkan jawaban dari stackoverflow ini What makes set faster than lists terdapat sebuah jawaban menarik yang menjelaskan bahwa sets lebih cepat dari lists. Seperti yang kita tau sebelumnya, bahwa kita menyimpan data coding_books dan recent_books dalam bentuk lists, oleh karena itu kita akan coba mengkonversikannya dalam bentuk sets.

start = time.time()
recent_coding_books =  set(recent_books).intersection(set(coding_books))
print(len(recent_coding_books))
print('Duration: {} seconds'.format(time.time() - start))

Waktu yang dibutuhkan untuk komputasinya yaitu

96
Duration: 0.01536870002746582 seconds

Bagaimana lebih cepat bukan? Hal yang dapat diambil dari studi kasus ini adalah pemahaman soal tipe data akan membantu kita menuliskan kode lebih baik, lebih cepat dan lebih solid.