Skip to content

andramarkov/Pyton-and-Nim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Nim, as fast as C, as expressive as Python

python nim logo

Beberapa waktu belakangan ini, lagi suka eksplorasi bahasa pemrograman yang 'jarang' di cari, setidaknya jika mengacu pada posting lowongan pekerjaan di job portal lokal.

Salah satu yang menarik perhatian saya adalah Nim yang sangat mirip dengan Python, menurut berbagai review, program yang di tulis dengan Nim ini sangat cepat bahkan (katanya) bisa mendekati bahkan setara eksekusi program yang di tulis dengan C.

Sebenarnya sebagai compiled languange tentunya eksekusi Nim sudah seyogyanya lebih cepat dari Python yang interpreted.

Saya mencoba hitungan sederhana approksimasi nilai pi dengan Monte Carlo Method (n = 100.000.000), hasilnya Nim sekitar 80 kali lebih cepat di banding Python.

Hasil percobaan:

1. Python (tidak di optimasi)

Waktu eksekusi sekitar 56 detik

python

2. Python dengan Numpy

Dengan bantuan Numpy, eksekusi menjadi jauh lebih cepat, sekitar 3.8 detik

python and numpy

3. Nim

Perhatikan kode nya yang sangat mirip dengan Python, waktu eksekusi sekitar 0.7 detik (flag = --gc:refc --passC:"-flto" -d:release)

nim

4. Python dengan Nimpy dan Nimporter

Ini sangat menarik karena memungkinkan integrasi bidireksional antara Python <-> Nim, ini memungkinkan kita untuk 'memanggil' library python seperti Pandas dan Numpy dari Nim, begitu juga sebaliknya 'memanggil' modul yang di tulis dengan Nim dari Python.

Untuk percobaan kali ini, skrip Python kita akan menyerahkan 'heavy lifting' approksimasi nilai pi kepada Nim, caranya sbb:

Di Nim kita import nimpy lalu menambahkan pragma {.exportpy.}

namafile: montenimpy.nim

import math
import random 
import nimpy

randomize()
proc approxpi(nthrows: float): float {.exportpy.} =
  var inside = 0.0
  for i in 1..int64(nthrows):
    if hypot(rand(1.0), rand(1.0)) <= 1:
      inside += 1
  result = 4 * inside / nthrows

Di Python kita import nimporter dan file nim di atas

namafile: app.py

import nimporter
import montenimpy
import time

start_nim = time.time()
print('pi: ',montenimpy.approxpi(100000000),' in: ', time.time() - start_nim)

Jalankan dengan perintah python app.py

python and nim

Waktu eksekusi sekitar 1.25 detik, walaupun tidak secepat native nim (0.7x detik) tetapi tetap lebih cepat di banding Python + Numpy (3.8 detik)

note: abaikan saja tab problem, itu bukan error

prob

Spesifikasi:

  • Prosesor: Intel Core i5-3437U
  • RAM: 8GB
  • OS: MacOS Catalina 10.15.7
  • Python: 3.9.4
  • Nim: 1.6.4