Tôi đã có lợi ích khi đọc các câu trả lời khác. Đối với những người mới bắt đầu, những người như tôi nên biết lý do tại sao chúng ta xử lý một số nguyên lớn như vậy ở đây là cả hai Python
và bc
thực hiện mở rộng lũy thừa liên kết đúng , có nghĩa là đây không phải là 6^36
chúng ta đang đánh giá 6^46656
mà là lớn hơn đáng kể. 1
Sử dụng các biến thể trên các lệnh sau, chúng ta có thể trích xuất trung bình cho một yếu tố cụ thể của đầu ra của cả time
từ và lệnh dành riêng:
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}'
Có thể đi một tuyến đường khác và loại bỏ các tập tin hoàn toàn khỏi so sánh. Ngoài ra, chúng ta có thể so sánh thời gian bc với một cái gì đó giống như dc
lệnh, như lịch sử trước đây là một "bộ xử lý kết thúc trước" để sau này. Các lệnh sau đã được tính thời gian:
echo 6^6^6 | bc
echo 6 6 6 ^ ^ p | dc
echo print 6**6**6 | python2.7
Lưu ý dc
lệnh là liên kết trái cho lũy thừa. 2
Chúng tôi có một số kết quả với time
(bash) trong 1000 lần lặp (tính bằng giây):
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
và dc
cung cấp hiệu suất tương đương trong bối cảnh này.
Ít chính xác hơn 3 kết quả từ lệnh /usr/bin/time
GNU time
(độ chính xác của thang đo không hợp lệ ở đây nhưng kết quả tương tự nhau):
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
Một lợi thế của /usr/bin/time
nó là nó cung cấp -v
tùy chọn mang lại nhiều thông tin hơn và cuối cùng có thể hữu ích.
Cũng có thể đánh giá nội bộ này để nói chuyện với timeit
mô-đun 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
Điều đó nhanh hơn một chút so với những gì chúng ta thấy trước đây. Hãy thử bản thân trình thông dịch:
>>> 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
Đó là cách nhanh nhất tôi từng thấy.
Nếu chúng ta đánh giá mức lũy thừa nhỏ hơn như thế 6^6
, thì lệnh thời gian mang lại kết quả đáng ngạc nhiên - sử dụng các for
lệnh lặp tương tự mà chúng ta đã sử dụng hiện có:
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
Vì vậy, với một số nguyên nhỏ hơn bc
là đột nhiên nhanh hơn nhiều ?? Từ khởi động lại hệ thống đến lần chạy thứ hai không có sự khác biệt. Tuy nhiên, đồng thời, nếu chúng ta sử dụng timeit
cho Python, chúng ta sẽ nhận được:
python2.7 -m timeit -n 100000 -r 1 'print 6**6' | grep loops
100000 loops, best of 1: 0.468 usec per loop
Đây là micro giây , không phải mili giây, do đó, điều này không khớp với kết quả chậm hơn nhiều khi sử dụng for
vòng lặp. Có thể các công cụ khác được yêu cầu để kiểm tra điều này hơn nữa và như những người khác đã giải thích có nhiều điều hơn là bắt mắt ở đây. Có vẻ như Python đã nhanh hơn trong kịch bản của câu hỏi nhưng không rõ liệu kết luận có thể được rút ra ngoài điều đó ...
1. Không cần phải nói nó vượt quá phạm vi của một cái gì đó như mở rộng số học của ech nghĩa là echo $((6**6**6))
- bash
cũng có thể là liên kết đúng cho điều đó tức là 6^6^6 = 6^(6^6)
.
2. So sánh với điều này : 6 6 ^ 6 ^ p
.
3. Có thể lệnh thời gian GNU cung cấp thêm thông tin khi chạy trên BSD UNIX (tài liệu thông tin thời gian GNU): Hầu hết thông tin được hiển thị theo 'thời gian' được lấy từ lệnh gọi hệ thống 'Wait3'. Các con số chỉ tốt bằng những con số được trả về bởi 'Wait3'. Nhiều hệ thống không đo lường tất cả các tài nguyên mà 'thời gian' có thể báo cáo; những tài nguyên được báo cáo là không. Các hệ thống đo lường hầu hết hoặc tất cả các tài nguyên đều dựa trên 4.2 hoặc 4.3BSD. Các bản phát hành BSD sau này sử dụng mã quản lý bộ nhớ khác nhau để đo lường ít tài nguyên hơn. - Trên các hệ thống không có cuộc gọi 'Wait3' trả về thông tin trạng thái, cuộc gọi hệ thống 'lần' được sử dụng thay thế. Nó cung cấp ít thông tin hơn nhiều so với 'Wait3', do đó, trên các hệ thống 'thời gian' đó báo cáo hầu hết các tài nguyên là 0.