Saya mencoba membandingkan dua cuplikan ini dan melihat berapa banyak iterasi yang dapat dilakukan dalam satu detik. Ternyata Julia mencapai 2,5 juta iterasi sedangkan Python 4 juta. Bukankah seharusnya Julia lebih cepat. Atau mungkin kedua cuplikan ini tidak setara?
Python:
t1 = time.time()
i = 0
while True:
i += 1
if time.time() - t1 >= 1:
break
Julia:
function f()
i = 0
t1 = now()
while true
i += 1
if now() - t1 >= Base.Dates.Millisecond(1000)
break
end
end
return i
end
Jawaban:
Ini adalah semacam perbandingan kinerja yang aneh karena biasanya seseorang mengukur waktu yang diperlukan untuk menghitung sesuatu yang substansial, daripada melihat berapa banyak iterasi sepele yang dapat dilakukan seseorang dalam jumlah waktu tertentu. Saya kesulitan membuat kode Python dan Julia Anda berfungsi, jadi saya memodifikasi kode Julia agar berfungsi dan tidak menjalankan kode Python. Seperti dicatat oleh @chepner dalam komentar, menggunakan
now()
dan melakukan perbandingan waktu denganDateTime
objek cukup mahal. Fungsi Pythontime.time()
hanya mengembalikan nilai floating-point. Ternyata, ada fungsi Julia disebuttime()
yang melakukan hal yang persis sama:Inilah waktu
f()
fungsi asli Anda (dimodifikasi untuk berfungsi) pada sistem saya:Itu hampir 5 juta iterasi sebelum waktu habis. Seperti yang saya katakan, saya tidak bisa mendapatkan kode Python Anda untuk berjalan di sistem saya tanpa mengutak-atik yang signifikan (yang saya tidak repot lakukan). Tapi di sini adalah versi
f()
yang menggunakantime()
, yang secara imajinatif saya sebutg()
:Versi ini menghasilkan 36 juta iterasi. Jadi saya kira Julia lebih cepat di perulangan? Yay! Sebenarnya pekerjaan utama dalam loop ini adalah panggilan untuk
time()
jadi ... Julia lebih cepat menghasilkan banyaktime()
panggilan!Mengapa aneh waktu ini? Seperti yang saya katakan, sebagian besar pekerjaan aktual di sini adalah menelepon
time()
. Sisa loop tidak benar-benar melakukan apa pun. Dalam bahasa kompilasi yang dioptimalkan, jika kompiler melihat loop yang tidak melakukan apa-apa, itu akan menghilangkannya sama sekali. Sebagai contoh:Woah, nol detik! Bagaimana mungkin? Baiklah, mari kita lihat kode LLVM (semacam kode mesin seperti tetapi untuk mesin imajiner yang digunakan sebagai representasi perantara) ini menurunkan ke:
Compiler melihat loop, memperkirakan bahwa hasilnya sama setiap kali, dan hanya mengembalikan nilai konstan itu daripada benar-benar mengeksekusi loop. Yang tentu saja membutuhkan waktu nol.
sumber
Anda mungkin ingin menggunakan
time_ns
fungsi di Julia:Di komputer saya ini berjalan 10x lebih cepat dari Python.
sumber
Yah, bukan itu yang saya amati di sistem saya:
Python 3.7.7
Julia 1.4.0:
tetapi perhatikan bahwa hanya menggunakan
time
(yaitu membandingkan angka biasa) masih lebih cepat:sumber
time.perf_counter_ns()
Python?time_ns
tidaktime
seperti ~ ~ 30% lebih cepat.