ฉันได้รับประโยชน์จากการอ่านคำตอบอื่น ๆ สำหรับผู้เริ่มต้นคนอย่างฉันควรรู้ว่าทำไมเราถึงต้องจัดการกับจำนวนเต็มขนาดใหญ่เช่นนี้นั่นก็คือทั้งคู่Python
และbc
ทำการขยายการยกกำลังเชื่อมโยงที่ถูกต้องซึ่งหมายความว่านี่ไม่ใช่6^36
เรากำลังประเมิน แต่ค่อนข้าง6^46656
ใหญ่กว่ามาก 1
การใช้ชุดรูปแบบในคำสั่งต่อไปนี้เราสามารถแยกค่าเฉลี่ยสำหรับองค์ประกอบเฉพาะของเอาต์พุตของทั้งtime
คำที่สงวนและคำสั่ง
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}'
เป็นไปได้ที่จะไปยังเส้นทางอื่นและลบไฟล์ทั้งหมดออกจากการเปรียบเทียบ นอกจากนี้เรายังสามารถเปรียบเทียบระยะเวลา BC กับบางสิ่งบางอย่างเช่นdc
คำสั่งเป็นอดีตอดีตคือ "การประมวลผลส่วนหน้า" เพื่อหลัง คำสั่งต่อไปนี้ถูกตั้งเวลา:
echo 6^6^6 | bc
echo 6 6 6 ^ ^ p | dc
echo print 6**6**6 | python2.7
หมายเหตุdc
คำสั่งนั้นเชื่อมโยงกันเพื่อการยกกำลัง 2
เรามีผลลัพธ์บางส่วนด้วยtime
(ทุบตี) เป็นเวลา 1,000 รอบ (เป็นวินาที):
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
และdc
เสนอประสิทธิภาพที่เทียบเท่าในบริบทนี้
ความแม่นยำน้อยกว่า3ผลลัพธ์จากคำสั่ง/usr/bin/time
GNU time
(ความแม่นยำของสเกลไม่ถูกต้องที่นี่ แต่ผลลัพธ์คล้ายกัน):
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
ข้อดีของ/usr/bin/time
มันคือมันมี-v
ตัวเลือกที่ให้ข้อมูลมากกว่าซึ่งอาจเป็นประโยชน์ในที่สุด
นอกจากนี้ยังเป็นไปได้ที่จะประเมินผลภายในเพื่อพูดคุยกับtimeit
โมดูล 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
มันเร็วกว่าที่เราเห็นนิดหน่อย ลองล่ามเอง:
>>> 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
นั่นคือเร็วที่สุดที่ฉันเคยเห็น
หากเราประเมินค่า exponentiation ที่น้อยกว่าเช่น6^6
นั้นคำสั่ง time จะให้ผลลัพธ์ที่น่าประหลาดใจโดยใช้for
คำสั่ง loop เดียวกันกับที่เราใช้ตอนนี้
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
ดังนั้นด้วยจำนวนเต็มขนาดเล็กbc
จะเร็วกว่าทั้งหมดทันที? จากการรีบูตระบบไปจนถึงการรันครั้งที่สองก็ไม่ต่างอะไร แต่ในเวลาเดียวกันถ้าเราใช้timeit
สำหรับ Python เราจะได้รับ:
python2.7 -m timeit -n 100000 -r 1 'print 6**6' | grep loops
100000 loops, best of 1: 0.468 usec per loop
นี่คือไมโครวินาทีไม่ใช่มิลลิวินาทีดังนั้นจึงไม่ตรงกับผลลัพธ์ที่ช้ากว่ามากเมื่อใช้for
ลูป อาจต้องใช้เครื่องมืออื่นเพื่อทดสอบสิ่งนี้เพิ่มเติมและในขณะที่คนอื่น ๆ อธิบายว่ามันมีมากกว่าที่เห็น ดูเหมือนว่า Python จะเร็วกว่าในสถานการณ์ของคำถาม แต่ไม่ชัดเจนว่าจะสามารถสรุปได้อย่างไร ...
1. ความจำเป็นที่จะบอกว่ามันเกินขอบเขตของสิ่งที่ต้องการสะท้อนการขยายตัวทางคณิตศาสตร์เช่นecho $((6**6**6))
- bash
ยังเกิดขึ้นเป็นขวาเชื่อมโยงสำหรับ 6^6^6 = 6^(6^6)
IE
2. 6 6 ^ 6 ^ p
เปรียบเทียบกับนี้:
3. อาจเป็นไปได้ที่คำสั่งเวลาของ GNU จะให้ข้อมูลเพิ่มเติมเมื่อทำงานกับ BSD UNIX (เอกสารข้อมูลเวลาของ GNU): ข้อมูลส่วนใหญ่ที่แสดงโดย 'เวลา' นั้นได้มาจากการเรียกระบบ 'wait3' ตัวเลขนั้นดีเท่าตัวเลขที่ส่งคืนโดย 'wait3' ระบบจำนวนมากไม่ได้วัดทรัพยากรทั้งหมดที่ 'เวลา' สามารถรายงานได้ ทรัพยากรเหล่านั้นถูกรายงานว่าเป็นศูนย์ ระบบที่ใช้วัดทรัพยากรส่วนใหญ่หรือทั้งหมดนั้นใช้ระบบ 4.2 หรือ 4.3BSD BSD รุ่นใหม่กว่าใช้รหัสการจัดการหน่วยความจำที่แตกต่างกันซึ่งวัดทรัพยากรน้อยลง - สำหรับระบบที่ไม่มีการเรียก 'wait3' ที่ส่งคืนข้อมูลสถานะการเรียกใช้ระบบ 'times' จะถูกใช้แทน มันให้ข้อมูลน้อยกว่า 'wait3' ดังนั้นเวลา 'ระบบ' เหล่านั้นจึงรายงานว่าทรัพยากรส่วนใหญ่เป็นศูนย์