Đối với python hẹn giờ vòng lặp
Trong bài viết này, chúng ta sẽ xem cách tạo đồng hồ đếm ngược bằng Python. Mã sẽ lấy thông tin đầu vào từ người dùng về thời lượng đếm ngược tính bằng giây. Sau đó, trên màn hình có định dạng 'phút' sẽ bắt đầu đếm ngược. giây'. Chúng tôi sẽ sử dụng mô-đun thời gian ở đây Show Tiếp cậnTrong dự án này, chúng ta sẽ sử dụng time module và hàm sleep() của nó. Làm theo các bước dưới đây để tạo đồng hồ đếm ngược đồng hồ bấm giờBộ đếm thời gian vòng lặp kiểu thanh tiến trình với thời gian hoàn thành dự kiến Cài đặt>>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 0.3018611848820001 >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 0.2727368790656328 >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.237026798073202372 Cách sử dụngBọc trực tiếp bất kỳ lần lặp nào với >>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 0.3018611848820001 >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 0.2727368790656328 >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.237026798073202373 để nhận trạng thái tiến trình lặp from looptimer import timedloop for _ in timedloop(range(100), label='foo'): ... đầu ra mẫuđối số tùy chọnArgumentTypeDefaultDescription_______24strNoneDescriptive label in ở bên trái của thanh tiến trình>>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 0.3018611848820001 >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 0.2727368790656328 >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.237026798073202375str▢Ký tự được sử dụng để điền vào thanh tiến trình >>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 0.3018611848820001 >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 0.2727368790656328 >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.237026798073202376int20Chiều rộng ký tự của thanh tiến trình >>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 0.3018611848820001 >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 0.2727368790656328 >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.237026798073202377boolTrueDisable để in mỗi bản cập nhật trên một dòng mới (hữu ích khi xen kẽ với các thông báo bản ghi khác) >>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 0.3018611848820001 >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 0.2727368790656328 >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.237026798073202378float0. 1Sử dụng để điều chỉnh tần suất in cho các vòng lặp nhanh Mô-đun này cung cấp một cách đơn giản để định thời gian cho các đoạn mã Python nhỏ. Nó có cả một cũng như một. Nó tránh được một số bẫy phổ biến để đo thời gian thực hiện. Xem thêm phần giới thiệu của Tim Peters về chương "Thuật toán" trong ấn bản thứ hai của Python Cookbook, do O'Reilly xuất bản Ví dụ cơ bảnVí dụ sau đây cho thấy cách có thể sử dụng để so sánh ba biểu thức khác nhau $ python3 -m timeit '"-".join(str(n) for n in range(100))' 10000 loops, best of 5: 30.2 usec per loop $ python3 -m timeit '"-".join([str(n) for n in range(100)])' 10000 loops, best of 5: 27.5 usec per loop $ python3 -m timeit '"-".join(map(str, range(100)))' 10000 loops, best of 5: 23.2 usec per loop Điều này có thể đạt được từ với >>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 0.3018611848820001 >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 0.2727368790656328 >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.23702679807320237 Một callable cũng có thể được chuyển từ >>> timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000) 0.19665591977536678 Tuy nhiên, xin lưu ý rằng điều đó sẽ tự động xác định số lần lặp lại chỉ khi sử dụng giao diện dòng lệnh. Trong phần này, bạn có thể tìm thấy các ví dụ nâng cao hơn Giao diện PythonMô-đun định nghĩa ba chức năng tiện lợi và một lớp công khai thời gian. thời gian(stmt='pass' , setup='pass', timer=Tạo một thể hiện với câu lệnh đã cho, mã thiết lập và chức năng hẹn giờ và chạy phương thức của nó với số lần thực thi. Đối số toàn cầu tùy chọn chỉ định một không gian tên để thực thi mã Đã thay đổi trong phiên bản 3. 5. Tham số toàn cầu tùy chọn đã được thêm vào. thời gian. lặp lại(stmt='pass' , setup='pass', timer=Tạo một thể hiện với câu lệnh đã cho, mã thiết lập và chức năng hẹn giờ và chạy phương thức của nó với số lần thực thi và số lần lặp lại đã cho. Đối số toàn cầu tùy chọn chỉ định một không gian tên để thực thi mã Đã thay đổi trong phiên bản 3. 5. Tham số toàn cầu tùy chọn đã được thêm vào. Đã thay đổi trong phiên bản 3. 7. Giá trị lặp lại mặc định đã thay đổi từ 3 thành 5. thời gian. default_timer()Bộ đếm thời gian mặc định, luôn luôn Đã thay đổi trong phiên bản 3. 3. hiện là bộ hẹn giờ mặc định. lớp thời gian. Hẹn giờ(stmt='pass' , setup='pass', timer=Lớp cho tốc độ thực thi thời gian của các đoạn mã nhỏ Hàm tạo nhận một câu lệnh được tính thời gian, một câu lệnh bổ sung được sử dụng để thiết lập và chức năng hẹn giờ. Cả hai câu lệnh đều mặc định là >>> timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000) 0.196655919775366781; . stmt và thiết lập cũng có thể chứa nhiều câu lệnh được phân tách bằng >>> timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000) 0.196655919775366782 hoặc dòng mới, miễn là chúng không chứa ký tự chuỗi nhiều dòng. Theo mặc định, câu lệnh sẽ được thực thi trong không gian tên của timeit; Để đo thời gian thực hiện của câu lệnh đầu tiên, hãy sử dụng phương thức. Các phương thức và là các phương thức tiện lợi để gọi nhiều lần Thời gian thực hiện thiết lập được loại trừ khỏi tổng thời gian chạy thực thi Các thông số thiết lập và stmt cũng có thể lấy các đối tượng có thể gọi được mà không cần đối số. Điều này sẽ nhúng các cuộc gọi đến chúng trong một chức năng hẹn giờ mà sau đó sẽ được thực hiện bởi. Lưu ý rằng chi phí thời gian lớn hơn một chút trong trường hợp này do các lệnh gọi hàm bổ sung Đã thay đổi trong phiên bản 3. 5. Tham số toàn cầu tùy chọn đã được thêm vào. thời gian(số=1000000)Số thời gian thực hiện câu lệnh chính. Điều này thực thi câu lệnh thiết lập một lần, sau đó trả về thời gian cần thiết để thực thi câu lệnh chính một số lần, được tính bằng giây dưới dạng float. Đối số là số lần thông qua vòng lặp, mặc định là một triệu. Câu lệnh chính, câu lệnh thiết lập và chức năng hẹn giờ được sử dụng được truyền cho hàm tạo Ghi chú Theo mặc định, tạm thời tắt trong thời gian. Ưu điểm của phương pháp này là nó làm cho thời gian độc lập dễ so sánh hơn. Nhược điểm là GC có thể là một thành phần quan trọng trong hiệu suất của chức năng được đo. Nếu vậy, GC có thể được bật lại làm câu lệnh đầu tiên trong chuỗi thiết lập. Ví dụ timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()phạm vi tự động(gọi lại=Không có) Tự động xác định số lần gọi Đây là một hàm tiện lợi gọi đi gọi lại nhiều lần sao cho tổng thời gian >= 0. 2 giây, trả về kết quả cuối cùng (số vòng lặp, thời gian thực hiện cho số vòng lặp đó). Nó gọi theo các số tăng dần từ dãy 1, 2, 5, 10, 20, 50,… cho đến khi thời gian thực hiện ít nhất là 0. 2 giây Nếu gọi lại được đưa ra và không phải là timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()2, thì nó sẽ được gọi sau mỗi lần thử với hai đối số. timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()3 Mới trong phiên bản 3. 6 lặp lại(lặp lại=5, number=1000000)Gọi vài lần Đây là một chức năng tiện lợi gọi lặp đi lặp lại, trả về một danh sách kết quả. Đối số đầu tiên chỉ định số lần gọi. Đối số thứ hai chỉ định đối số số cho Ghi chú Thật hấp dẫn khi tính toán giá trị trung bình và độ lệch chuẩn từ vectơ kết quả và báo cáo những giá trị này. Tuy nhiên, điều này không hữu ích lắm. Trong trường hợp điển hình, giá trị thấp nhất đưa ra giới hạn dưới cho tốc độ mà máy của bạn có thể chạy đoạn mã đã cho; . Vì vậy, kết quả có lẽ là con số duy nhất bạn nên quan tâm. Sau đó, bạn nên xem xét toàn bộ vectơ và áp dụng lẽ thường hơn là thống kê Đã thay đổi trong phiên bản 3. 7. Giá trị lặp lại mặc định đã thay đổi từ 3 thành 5. print_exc(tệp=Không có)Trình trợ giúp để in truy nguyên từ mã hẹn giờ sử dụng điển hình t = Timer(...) # outside the try/except try: t.timeit(...) # or t.repeat(...) except Exception: t.print_exc() Ưu điểm so với truy nguyên tiêu chuẩn là các dòng nguồn trong mẫu đã biên dịch sẽ được hiển thị. Đối số tệp tùy chọn chỉ đạo nơi gửi truy nguyên; Giao diện dòng lệnhKhi được gọi là một chương trình từ dòng lệnh, mẫu sau được sử dụng $ python3 -m timeit '"-".join(str(n) for n in range(100))' 10000 loops, best of 5: 30.2 usec per loop $ python3 -m timeit '"-".join([str(n) for n in range(100)])' 10000 loops, best of 5: 27.5 usec per loop $ python3 -m timeit '"-".join(map(str, range(100)))' 10000 loops, best of 5: 23.2 usec per loop0 Trường hợp các tùy chọn sau đây được hiểu -n N, --số=Nbao nhiêu lần để thực hiện 'tuyên bố' -r N, --lặp lại=Nbao nhiêu lần để lặp lại bộ đếm thời gian (mặc định 5) -s S, --thiết lập=Scâu lệnh sẽ được thực hiện một lần ban đầu (mặc định t = Timer(...) # outside the try/except try: t.timeit(...) # or t.repeat(...) except Exception: t.print_exc()0)-p, --quy trình đo thời gian xử lý, không phải thời gian đồng hồ treo tường, sử dụng thay vì , đây là mặc định Mới trong phiên bản 3. 3 -u, --đơn vị=Uchỉ định đơn vị thời gian cho đầu ra hẹn giờ; Mới trong phiên bản 3. 5 -v, --dài dòngin kết quả thời gian thô; in một thông báo sử dụng ngắn và thoát Một câu lệnh nhiều dòng có thể được đưa ra bằng cách chỉ định mỗi dòng là một đối số câu lệnh riêng biệt; . Nhiều tùy chọn được đối xử tương tự Nếu không được cung cấp, số vòng lặp phù hợp được tính bằng cách thử tăng các số từ chuỗi 1, 2, 5, 10, 20, 50, … cho đến khi tổng thời gian ít nhất là 0. 2 giây các phép đo có thể bị ảnh hưởng bởi các chương trình khác đang chạy trên cùng một máy, vì vậy điều tốt nhất nên làm khi cần thời gian chính xác là lặp lại thời gian một vài lần và sử dụng thời gian tốt nhất. Tùy chọn này là tốt cho việc này; . Bạn có thể sử dụng để đo thời gian CPU Ghi chú Có một chi phí cơ bản nhất định liên quan đến việc thực hiện một câu lệnh vượt qua. Mã ở đây không cố gắng che giấu nó, nhưng bạn nên biết về nó. Chi phí cơ sở có thể được đo bằng cách gọi chương trình mà không cần đối số và nó có thể khác nhau giữa các phiên bản Python ví dụCó thể cung cấp một câu lệnh thiết lập chỉ được thực hiện một lần khi bắt đầu $ python3 -m timeit '"-".join(str(n) for n in range(100))' 10000 loops, best of 5: 30.2 usec per loop $ python3 -m timeit '"-".join([str(n) for n in range(100)])' 10000 loops, best of 5: 27.5 usec per loop $ python3 -m timeit '"-".join(map(str, range(100)))' 10000 loops, best of 5: 23.2 usec per loop6 Ở đầu ra, có ba trường. Số vòng lặp, cho bạn biết số lần phần thân câu lệnh được chạy trên mỗi lần lặp lại vòng lặp định thời. Số lần lặp lại ('tốt nhất trong số 5') cho bạn biết vòng lặp thời gian đã được lặp lại bao nhiêu lần và cuối cùng là thời gian mà phần thân câu lệnh mất trung bình trong lần lặp lại tốt nhất của vòng lặp thời gian. Tức là, thời gian lặp lại nhanh nhất chia cho số vòng lặp $ python3 -m timeit '"-".join(str(n) for n in range(100))' 10000 loops, best of 5: 30.2 usec per loop $ python3 -m timeit '"-".join([str(n) for n in range(100)])' 10000 loops, best of 5: 27.5 usec per loop $ python3 -m timeit '"-".join(map(str, range(100)))' 10000 loops, best of 5: 23.2 usec per loop7 Điều tương tự cũng có thể được thực hiện bằng cách sử dụng lớp và các phương thức của nó $ python3 -m timeit '"-".join(str(n) for n in range(100))' 10000 loops, best of 5: 30.2 usec per loop $ python3 -m timeit '"-".join([str(n) for n in range(100)])' 10000 loops, best of 5: 27.5 usec per loop $ python3 -m timeit '"-".join(map(str, range(100)))' 10000 loops, best of 5: 23.2 usec per loop8 Các ví dụ sau đây cho biết cách tính thời gian cho các biểu thức chứa nhiều dòng. Ở đây chúng tôi so sánh chi phí sử dụng so với. / để kiểm tra các thuộc tính đối tượng bị thiếu và hiện tại $ python3 -m timeit '"-".join(str(n) for n in range(100))' 10000 loops, best of 5: 30.2 usec per loop $ python3 -m timeit '"-".join([str(n) for n in range(100)])' 10000 loops, best of 5: 27.5 usec per loop $ python3 -m timeit '"-".join(map(str, range(100)))' 10000 loops, best of 5: 23.2 usec per loop9 >>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 0.3018611848820001 >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 0.2727368790656328 >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.237026798073202370 Để cấp cho mô-đun quyền truy cập vào các chức năng bạn xác định, bạn có thể chuyển tham số thiết lập có chứa câu lệnh nhập >>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 0.3018611848820001 >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 0.2727368790656328 >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.237026798073202371 Một tùy chọn khác là chuyển đến tham số toàn cầu, điều này sẽ khiến mã được thực thi trong không gian tên chung hiện tại của bạn. Điều này có thể thuận tiện hơn so với việc chỉ định nhập khẩu riêng lẻ |