Append có chậm trong python không?

Khi Python ngày càng trở nên phổ biến, số lượng người dùng Python cũng tăng lên. Python thực sự tương đối dễ học. Nó cũng rất linh hoạt để có nhiều cách khả thi hơn để đạt được một chức năng

Tuy nhiên, bất cứ khi nào có nhiều cách để thực hiện một việc cụ thể, điều đó có nghĩa là mỗi phương pháp đều có ưu và nhược điểm. Trong bài viết này, tôi đã thu thập 6 cách viết mã Python điển hình có thể dẫn đến hiệu suất tương đối tệ

1. Không nhập mô-đun gốc

Hình ảnh được cung cấp bởi Andreas Riedelmeier từ Pixabay

Khi sử dụng Python, một điều chúng ta không thể tránh khỏi đó là nhập các mô-đun, mô-đun tích hợp sẵn hoặc bên thứ 3. Đôi khi, chúng ta có thể chỉ cần một hoặc một số chức năng hoặc đối tượng từ mô-đun đó. Trong trường hợp này, chúng ta nên cố gắng chỉ nhập các hàm hoặc đối tượng mà chúng ta cần, thay vì nhập mô-đun gốc

Đây là một ví dụ đơn giản. Giả sử chúng ta cần tính căn bậc hai cho một số số trong chương trình của mình

Ví dụ chậm hơn

import math
math.sqrt(100)

Trong ví dụ xấu, chúng tôi đã nhập mô-đun

from math import sqrt
sqrt(100)
2 và sử dụng
from math import sqrt
sqrt(100)
3 để truy cập chức năng. Tất nhiên, nó hoạt động mà không gặp vấn đề gì, nhưng hiệu suất sẽ tốt hơn nếu chúng ta có thể nhập hàm
from math import sqrt
sqrt(100)
4

Ví dụ nhanh hơn

from math import sqrt
sqrt(100)

Tốc độ này nhanh hơn 25% so với bản gốc. Ngoài ra, nếu chúng ta cần sử dụng hàm căn bậc hai nhiều lần trong chương trình của mình, mã sẽ gọn gàng và sạch sẽ hơn

2. Tránh sử dụng Dot / Dot Chaining

Hình ảnh được cung cấp bởi ancapictures từ Pixabay

Rất trực quan khi sử dụng dấu chấm

from math import sqrt
sqrt(100)
5 trong Python để truy cập các thuộc tính hoặc hàm từ một đối tượng. Hầu hết thời gian, không có vấn đề gì. Tuy nhiên, nếu chúng ta có thể tránh sử dụng dấu chấm hoặc thậm chí là dấu chấm nối tiếp, thì hiệu suất thực sự sẽ tốt hơn

Ví dụ bên dưới hiển thị việc thêm một số vào danh sách rồi xóa số đó

Ví dụ chậm hơn

my_list = [1, 2, 3]my_list.append(4)
my_list.remove(4)

Ví dụ nhanh hơn

my_list = [1, 2, 3]append = my_list.append
remove = my_list.remove
append(4)
remove(4)

Nếu bạn không tin rằng điều đó thực sự làm điều tương tự, chúng tôi có thể xác minh điều đó

Sự xem xét

Tôi có thể mong đợi rằng nhiều nhà phát triển Python sẽ nói rằng kỹ thuật trong ví dụ này hơi vô lý. Thực ra ngay cả bản thân mình cũng ít khi viết code như trên. Tuy nhiên, thật tốt khi biết rằng chúng ta có thể lập trình như vậy và thậm chí có thể làm cho nó nhanh hơn

Nếu chúng tôi muốn nối thêm vào danh sách và xóa các mục khỏi danh sách đó hàng triệu lần, có lẽ chúng tôi nên cân nhắc sử dụng mẹo này. Đó là lý do tại sao chúng ta cần cân bằng giữa hiệu suất và khả năng đọc mã của mình

3. Không sử dụng + để nối các chuỗi

Hình ảnh được cung cấp bởi PIRO4D từ Pixabay

Các chuỗi là bất biến trong Python. Do đó, khi chúng ta sử dụng “+” để nối nhiều chuỗi lại với nhau thành một chuỗi dài, thì mỗi chuỗi con sẽ hoạt động riêng biệt

Ví dụ chậm hơn

________số 8

Cụ thể, đối với mỗi chuỗi con, nó cần yêu cầu một địa chỉ bộ nhớ và sau đó nối nó với chuỗi gốc trong địa chỉ bộ nhớ đó. Điều này trở thành một loại chi phí

Ví dụ nhanh hơn

def join_strs_better(strs):
return ' '.join(strs)
join_strs_better(strs)

Tuy nhiên, khi chúng ta đang sử dụng hàm

from math import sqrt
sqrt(100)
6, hàm này biết trước tất cả các chuỗi con và địa chỉ bộ nhớ được cấp phát với độ dài phù hợp với chuỗi được nối cuối cùng. Do đó, không có chi phí cấp phát bộ nhớ cho mỗi chuỗi con

Sự xem xét

Rất khuyến khích sử dụng chức năng

from math import sqrt
sqrt(100)
6 càng nhiều càng tốt. Tuy nhiên, đôi khi chúng ta có thể chỉ muốn nối hai chuỗi. Hoặc, chỉ vì mục đích thuận tiện mà chúng tôi muốn sử dụng “+”. Trong những trường hợp đó, sử dụng dấu “+” dẫn đến khả năng đọc tốt hơn và độ dài mã ít hơn

4. Không sử dụng biến tạm thời để trao đổi giá trị

Hình ảnh được cung cấp bởi magee từ Pixabay

Nhiều thuật toán yêu cầu trao đổi giá trị của hai biến. Trong hầu hết các ngôn ngữ lập trình khác, điều này thường được thực hiện bằng cách đưa vào một biến tạm thời như sau

Ví dụ chậm hơn

from math import sqrt
sqrt(100)
2

Rất trực quan là chúng ta cần một biến tạm thời làm bộ đệm. Vì vậy, nó sẽ giúp giữ giá trị của biến

from math import sqrt
sqrt(100)
8 trong khi giá trị của biến
from math import sqrt
sqrt(100)
9 được truyền cho biến
from math import sqrt
sqrt(100)
8. Sau đó, giá trị của
from math import sqrt
sqrt(100)
8 trong bộ đệm có thể được gán cho biến
from math import sqrt
sqrt(100)
9

Ví dụ nhanh hơn

Tuy nhiên, trong Python, chúng ta không phải sử dụng biến tạm thời. Python có cú pháp tích hợp để đạt được giá trị trao đổi này như sau

from math import sqrt
sqrt(100)
8

Nó không chỉ nhanh hơn một chút mà còn làm cho mã của chúng ta gọn gàng và sạch sẽ hơn

5. Sử dụng ngắn mạch cho điều kiện nếu

Hình ảnh được cung cấp bởi Lấy từ Pixabay

Đánh giá “ngắn mạch” tồn tại trong nhiều ngôn ngữ lập trình, Python cũng vậy. Về cơ bản, nó đề cập đến hành vi mà một số toán tử boolean trong đó đối số thứ hai chỉ được thực thi hoặc đánh giá nếu đối số thứ nhất KHÔNG đủ để xác định giá trị của toàn bộ biểu thức

Hãy chứng minh điều này trong một ví dụ. Giả sử chúng ta có một danh sách như sau

from math import sqrt
sqrt(100)
9

Công việc của chúng ta là lọc danh sách để tìm tất cả những người có tên bắt đầu bằng chữ “C”, và tuổi trên hoặc bằng 30

Ví dụ chậm hơn

Có hai điều kiện mà cả hai cần phải được thỏa mãn

  • Tên bắt đầu bằng chữ “C”
  • Tuổi ≥ 30

Vì vậy, chúng ta có thể viết mã như sau

from math import sqrt
sqrt(100)
0

Ví dụ nhanh hơn

Chà, không có gì sai với mã trong ví dụ trước. Tuy nhiên, trong ví dụ trang điểm cụ thể này, chỉ có “Chris” ở độ tuổi trên 30

Do đó nếu ta viết điều kiện kiểm tra tên trước thì có 3 tên thỏa mãn (Chris, Chelsea và Carol). Khi đó, điều kiện thứ 2 về tuổi sẽ được kiểm tra lại cho cả 3 người này

Tuy nhiên, do đánh giá ngắn mạch, nếu chúng tôi viết điều kiện tuổi trước, chỉ có tuổi của Chris là trên 30 và sẽ được kiểm tra kỹ xem tên của anh ấy có bắt đầu bằng chữ “C” hay không

Trong trường hợp này, nó nhanh hơn gần như 100%

6. Không sử dụng vòng lặp While nếu chúng ta có thể sử dụng vòng lặp For

Hình ảnh được cung cấp bởi ancapictures từ Pixabay

Python sử dụng rất nhiều C để cải thiện hiệu suất, cụ thể là CPython. Về câu lệnh lặp, Vòng lặp For trong Python có số bước tương đối ít hơn trong đó nhiều bước chạy dưới dạng mã C hơn Vòng lặp While

Do đó, khi chúng ta có thể sử dụng vòng lặp For-Loop trong Python thì không nên sử dụng vòng lặp while. Điều này không chỉ vì For-Loop thanh lịch hơn trong Python mà còn có hiệu suất tốt hơn

Ví dụ chậm hơn

from math import sqrt
sqrt(100)
0

Ví dụ nhanh hơn

from math import sqrt
sqrt(100)
1

Tóm lược

Hình ảnh được cung cấp bởi Hervé Lagrange từ Pixabay

Trong bài viết này, tôi đã liệt kê 6 mẹo giúp chương trình Python của bạn nhanh hơn. Tuy nhiên, cũng cần hết sức lưu ý, không nên lúc nào cũng đặt hiệu quả công việc lên hàng đầu. Đôi khi, tính dễ đọc và ngắn gọn cũng nên được tính đến

Đó là tất cả về sự cân bằng. )

Đọc mọi câu chuyện của Christopher Tao (và hàng nghìn nhà văn khác trên Medium)

Là thành viên Phương tiện, một phần phí thành viên của bạn sẽ được chuyển đến các tác giả mà bạn đã đọc và bạn có toàn quyền truy cập vào mọi câu chuyện…

trung bình. com

Nếu bạn cảm thấy bài viết của tôi hữu ích, hãy cân nhắc tham gia Medium Membership để ủng hộ tôi và hàng ngàn người viết khác. (Nhấp vào liên kết ở trên)

Tại sao Python chắp thêm chậm?

append() có thể khiến python phân bổ thêm bộ nhớ , việc này sẽ mất thời gian.

Python nối thêm danh sách nhanh như thế nào?

Điều này cho chúng tôi biết rằng, sẽ mất khoảng 0. 60 giây để thêm danh sách mới có 1 phần tử vào danh sách trước đó. Mặt khác, việc tạo một bộ có 1 phần tử mất khoảng 0. 17 giây.

Mở rộng hoặc nối thêm Python nhanh hơn?

extend((i/j,j)) hiệu quả hơn cả hai vì nó không tạo danh sách trung gian. Tạo một tuple trung gian rẻ hơn

Cái nào nối thêm hoặc chèn nhanh hơn?

Chèn chậm hơn khi so sánh với chắp thêm .