ฉันได้รับประโยชน์จากการอ่านคำตอบอื่น ๆ สำหรับผู้เริ่มต้นคนอย่างฉันควรรู้ว่าทำไมเราถึงต้องจัดการกับจำนวนเต็มขนาดใหญ่เช่นนี้นั่นก็คือทั้งคู่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/timeGNU 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' ดังนั้นเวลา 'ระบบ' เหล่านั้นจึงรายงานว่าทรัพยากรส่วนใหญ่เป็นศูนย์