Saya mendapat manfaat dari membaca jawaban lain. Sebagai permulaan, orang-orang seperti saya harus tahu alasan mengapa kita berurusan dengan bilangan bulat yang sangat besar di sini adalah karena keduanya Python
dan bc
melakukan ekspansi eksponensial asosiatif yang benar, yang berarti bahwa ini bukan 6^36
kita sedang mengevaluasi tetapi lebih tepatnya 6^46656
yang jauh lebih besar. 1
Menggunakan variasi pada perintah berikut, kita dapat mengekstrak rata-rata untuk elemen spesifik dari output time
kata dan perintah yang dipesan:
for i in {1..1000}; do (time echo 6^6^6 | bc > /dev/null) 2>&1; done | grep 'rea' | sed -e s/.*m// | awk '{sum += $1} END {print sum / NR}'
for i in {1..1000}; do (/usr/bin/time -v sh -c 'echo 6^6^6 | bc > /dev/null') 2>&1; done | grep 'Use' | sed -e s/.*:// | awk '{sum += $1} END {print sum / NR}'
Dimungkinkan untuk memilih rute lain dan menghapus file sepenuhnya dari perbandingan. Juga, kita dapat membandingkan waktu bc dengan sesuatu seperti dc
perintah, karena secara historis yang pertama adalah "prosesor ujung depan" ke yang terakhir. Perintah berikut diberi batas waktu:
echo 6^6^6 | bc
echo 6 6 6 ^ ^ p | dc
echo print 6**6**6 | python2.7
Perhatikan bahwa dc
perintah tersebut adalah asosiatif kiri untuk eksponensial. 2
Kami memiliki beberapa hasil dengan time
(bash) untuk 1000 iterasi (dalam detik):
0.229678 real bc
0.228348 user bc
0.000569 sys bc
0.23306 real dc
0.231786 user dc
0.000395 sys dc
0.07 real python
0.065907 user python
0.003141 sys python
bc
dan dc
menawarkan kinerja yang sebanding dalam konteks ini.
Kurang akurat 3 hasil dari perintah /usr/bin/time
GNU yaitu time
(skala presisi tidak valid di sini tetapi hasilnya serupa):
0.2224 user bc
0 sys bc
0.23 Elapsed bc
0.22998 user dc
0 sys dc
0.23 Elapsed dc
0.06008 user python
0 sys python
0.07 Elapsed python
Keuntungannya /usr/bin/time
adalah ia menawarkan -v
opsi yang menghasilkan lebih banyak informasi yang akhirnya berguna.
Dimungkinkan juga untuk mengevaluasi ini secara internal sehingga dapat berbicara dengan timeit
modul Python:
python2.7 -m timeit -n 1000 -r 1 'print 6**6**6' | grep 'loops'
1000 loops, best of 1: 55.4 msec per loop
Itu sedikit lebih cepat dari yang kita lihat sebelumnya. Mari kita coba penerjemahnya sendiri:
>>> import timeit
>>> import sys
>>> import os
>>> T = timeit.Timer("print 6**6**6")
>>> n = int(1000)
>>> f = open(os.devnull, 'w')
>>> sys.stdout = f
>>> t = t.timeit(n)
>>> sys.stdout = sys.__stdout__
>>> print t/n
0.0553743481636
Itu tercepat yang pernah saya lihat.
Jika kita mengevaluasi exponentiation yang lebih rendah seperti 6^6
, maka perintah waktu menghasilkan hasil yang mengejutkan - menggunakan for
perintah loop yang sama yang kita gunakan sekarang kita miliki:
0.001001 bc real
0.000304 user
0.000554 sys
0.014 python real i.e. 10x more than bc??
0.010432 user
0.002606 sys
Jadi dengan integer yang lebih kecil bc
tiba-tiba jauh lebih cepat ?? Dari sistem reboot untuk menjalankan kedua tidak ada bedanya. Namun pada saat yang sama, jika kita menggunakan timeit
untuk Python, kita mendapatkan:
python2.7 -m timeit -n 100000 -r 1 'print 6**6' | grep loops
100000 loops, best of 1: 0.468 usec per loop
Ini adalah mikrodetik , bukan milidetik, jadi ini tidak cocok dengan hasil yang jauh lebih lambat menggunakan for
loop. Mungkin alat lain diperlukan untuk menguji ini lebih lanjut dan seperti yang telah dijelaskan orang lain ada lebih dari memenuhi mata di sini. Tampaknya Python lebih cepat dalam skenario pertanyaan tetapi tidak jelas apakah kesimpulan dapat ditarik lebih dari itu ...
1. Tak perlu dikatakan itu di luar lingkup sesuatu seperti ekspansi aritmatika gema yaitu echo $((6**6**6))
- bash
juga kebetulan asosiatif yang tepat untuk itu yaitu 6^6^6 = 6^(6^6)
.
2. Bandingkan dengan ini: 6 6 ^ 6 ^ p
.
3. Mungkin perintah waktu GNU memberikan lebih banyak info saat dijalankan pada BSD UNIX (dokumen info waktu GNU): Sebagian besar informasi yang ditampilkan oleh 'waktu' berasal dari panggilan sistem 'wait3'. Jumlahnya hanya sebagus yang dikembalikan oleh 'wait3'. Banyak sistem tidak mengukur semua sumber daya yang 'waktu' dapat laporkan; sumber daya tersebut dilaporkan sebagai nol. Sistem yang mengukur sebagian besar atau semua sumber daya didasarkan pada 4.2 atau 4.3BSD. Rilis BSD kemudian menggunakan kode manajemen memori yang berbeda yang mengukur lebih sedikit sumber daya. - Pada sistem yang tidak memiliki panggilan 'wait3' yang mengembalikan informasi status, panggilan sistem 'kali' digunakan sebagai gantinya. Ini memberikan informasi yang jauh lebih sedikit daripada 'wait3', jadi pada sistem 'waktu' itu melaporkan sebagian besar sumber daya sebagai nol.