Hướng dẫn python in-memory cache - bộ đệm trong bộ nhớ python

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Bộ đệm trong Python với LRU_CACHE This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Caching in Python With lru_cache

Có nhiều cách để đạt được các ứng dụng nhanh và đáp ứng. Bộ nhớ đệm là một cách tiếp cận, khi được sử dụng chính xác, làm cho mọi thứ nhanh hơn nhiều trong khi giảm tải cho tài nguyên điện toán. Mô -đun Python sườn

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
7 đi kèm với trình trang trí
$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8, cung cấp cho bạn khả năng lưu trữ kết quả của các chức năng của bạn bằng chiến lược ít được sử dụng gần đây (LRU) gần đây. Đây là một kỹ thuật đơn giản nhưng mạnh mẽ mà bạn có thể sử dụng để tận dụng sức mạnh của bộ đệm trong mã của bạn.Caching is one approach that, when used correctly, makes things much faster while decreasing the load on computing resources. Python’s
$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
7 module comes with the
$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 decorator, which gives you the ability to cache the result of your functions using the Least Recently Used (LRU) strategy. This is a simple yet powerful technique that you can use to leverage the power of caching in your code.

Trong hướng dẫn này, bạn sẽ học:

  • Những chiến lược lưu trữ có sẵn và cách thực hiện chúng bằng cách sử dụng các nhà trang trí Pythoncaching strategies are available and how to implement them using Python decorators
  • Chiến lược LRU là gì và cách thức hoạt động của nóLRU strategy is and how it works
  • Cách cải thiện hiệu suất bằng cách lưu trữ với người trang trí
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8 decorator
  • Cách mở rộng chức năng của người trang trí
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8 và làm cho nó hết hạn sau một thời gian cụ thểexpire after a specific time

Đến cuối hướng dẫn này, bạn sẽ có một sự hiểu biết sâu sắc hơn về cách thức hoạt động của bộ đệm và cách tận dụng nó trong Python.

Bộ nhớ đệm và sử dụng của nó

Bộ nhớ đệm là một kỹ thuật tối ưu hóa mà bạn có thể sử dụng trong các ứng dụng của mình để giữ dữ liệu gần đây hoặc thường được sử dụng ở các vị trí bộ nhớ nhanh hơn hoặc tính toán rẻ hơn để truy cập so với nguồn của chúng. is an optimization technique that you can use in your applications to keep recent or often-used data in memory locations that are faster or computationally cheaper to access than their source.

Hãy tưởng tượng bạn đang xây dựng một ứng dụng Readerer tin tức về những tin tức mới nhất từ ​​các nguồn khác nhau. Khi người dùng điều hướng qua danh sách, ứng dụng của bạn tải xuống các bài viết và hiển thị chúng trên màn hình.

Điều gì sẽ xảy ra nếu người dùng quyết định di chuyển nhiều lần qua lại giữa một vài bài báo tin tức? Trừ khi bạn đã lưu trữ dữ liệu, ứng dụng của bạn sẽ phải tìm nạp cùng một nội dung mỗi lần! Điều đó sẽ làm cho hệ thống người dùng của bạn chậm chạp và gây thêm áp lực lên máy chủ lưu trữ các bài viết.

Một cách tiếp cận tốt hơn sẽ là lưu trữ nội dung cục bộ sau khi tìm nạp từng bài viết. Sau đó, lần tiếp theo người dùng quyết định mở một bài viết, ứng dụng của bạn có thể mở nội dung từ một bản sao lưu trữ cục bộ thay vì quay lại nguồn. Trong khoa học máy tính, kỹ thuật này được gọi là bộ nhớ đệm.caching.

Thực hiện bộ nhớ cache bằng từ điển Python

Bạn có thể thực hiện một giải pháp bộ đệm trong Python bằng cách sử dụng từ điển.

Ở lại với ví dụ NewsReader, thay vì truy cập trực tiếp đến máy chủ mỗi khi bạn cần tải xuống một bài viết, bạn có thể kiểm tra xem bạn có nội dung trong bộ nhớ cache của mình không và quay lại máy chủ nếu bạn không có. Bạn có thể sử dụng URL bài viết làm khóa và nội dung của nó làm giá trị.

Ở đây, một ví dụ về cách kỹ thuật bộ đệm này có thể trông:

 1import requests
 2
 3cache = dict()
 4
 5def get_article_from_server(url):
 6    print("Fetching article from server...")
 7    response = requests.get(url)
 8    return response.text
 9
10def get_article(url):
11    print("Getting article...")
12    if url not in cache:
13        cache[url] = get_article_from_server(url)
14
15    return cache[url]
16
17get_article("https://realpython.com/sorting-algorithms-python/")
18get_article("https://realpython.com/sorting-algorithms-python/")

Lưu mã này vào tệp

 1def steps_to(stair):
 2    if stair == 1:
 3        # You can reach the first stair with only a single step
 4        # from the floor.
 5        return 1
 6    elif stair == 2:
 7        # You can reach the second stair by jumping from the
 8        # floor with a single two-stair hop or by jumping a single
 9        # stair a couple of times.
10        return 2
11    elif stair == 3:
12        # You can reach the third stair using four possible
13        # combinations:
14        # 1. Jumping all the way from the floor
15        # 2. Jumping two stairs, then one
16        # 3. Jumping one stair, then two
17        # 4. Jumping one stair three times
18        return 4
19    else:
20        # You can reach your current stair from three different places:
21        # 1. From three stairs down
22        # 2. From two stairs down
23        # 2. From one stair down
24        #
25        # If you add up the number of ways of getting to those
26        # those three positions, then you should have your solution.
27        return (
28            steps_to(stair - 3)
29            + steps_to(stair - 2)
30            + steps_to(stair - 1)
31        )
32
33print(steps_to(4))
1, cài đặt thư viện
 1def steps_to(stair):
 2    if stair == 1:
 3        # You can reach the first stair with only a single step
 4        # from the floor.
 5        return 1
 6    elif stair == 2:
 7        # You can reach the second stair by jumping from the
 8        # floor with a single two-stair hop or by jumping a single
 9        # stair a couple of times.
10        return 2
11    elif stair == 3:
12        # You can reach the third stair using four possible
13        # combinations:
14        # 1. Jumping all the way from the floor
15        # 2. Jumping two stairs, then one
16        # 3. Jumping one stair, then two
17        # 4. Jumping one stair three times
18        return 4
19    else:
20        # You can reach your current stair from three different places:
21        # 1. From three stairs down
22        # 2. From two stairs down
23        # 2. From one stair down
24        #
25        # If you add up the number of ways of getting to those
26        # those three positions, then you should have your solution.
27        return (
28            steps_to(stair - 3)
29            + steps_to(stair - 2)
30            + steps_to(stair - 1)
31        )
32
33print(steps_to(4))
2, sau đó chạy tập lệnh:

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...

Lưu ý cách bạn nhận được chuỗi

 1def steps_to(stair):
 2    if stair == 1:
 3        # You can reach the first stair with only a single step
 4        # from the floor.
 5        return 1
 6    elif stair == 2:
 7        # You can reach the second stair by jumping from the
 8        # floor with a single two-stair hop or by jumping a single
 9        # stair a couple of times.
10        return 2
11    elif stair == 3:
12        # You can reach the third stair using four possible
13        # combinations:
14        # 1. Jumping all the way from the floor
15        # 2. Jumping two stairs, then one
16        # 3. Jumping one stair, then two
17        # 4. Jumping one stair three times
18        return 4
19    else:
20        # You can reach your current stair from three different places:
21        # 1. From three stairs down
22        # 2. From two stairs down
23        # 2. From one stair down
24        #
25        # If you add up the number of ways of getting to those
26        # those three positions, then you should have your solution.
27        return (
28            steps_to(stair - 3)
29            + steps_to(stair - 2)
30            + steps_to(stair - 1)
31        )
32
33print(steps_to(4))
3 được in một lần mặc dù đã gọi
 1def steps_to(stair):
 2    if stair == 1:
 3        # You can reach the first stair with only a single step
 4        # from the floor.
 5        return 1
 6    elif stair == 2:
 7        # You can reach the second stair by jumping from the
 8        # floor with a single two-stair hop or by jumping a single
 9        # stair a couple of times.
10        return 2
11    elif stair == 3:
12        # You can reach the third stair using four possible
13        # combinations:
14        # 1. Jumping all the way from the floor
15        # 2. Jumping two stairs, then one
16        # 3. Jumping one stair, then two
17        # 4. Jumping one stair three times
18        return 4
19    else:
20        # You can reach your current stair from three different places:
21        # 1. From three stairs down
22        # 2. From two stairs down
23        # 2. From one stair down
24        #
25        # If you add up the number of ways of getting to those
26        # those three positions, then you should have your solution.
27        return (
28            steps_to(stair - 3)
29            + steps_to(stair - 2)
30            + steps_to(stair - 1)
31        )
32
33print(steps_to(4))
4 hai lần, trong dòng 17 và 18. Điều này xảy ra bởi vì, sau khi truy cập bài viết lần đầu tiên, bạn đặt URL và nội dung của nó vào từ điển
 1def steps_to(stair):
 2    if stair == 1:
 3        # You can reach the first stair with only a single step
 4        # from the floor.
 5        return 1
 6    elif stair == 2:
 7        # You can reach the second stair by jumping from the
 8        # floor with a single two-stair hop or by jumping a single
 9        # stair a couple of times.
10        return 2
11    elif stair == 3:
12        # You can reach the third stair using four possible
13        # combinations:
14        # 1. Jumping all the way from the floor
15        # 2. Jumping two stairs, then one
16        # 3. Jumping one stair, then two
17        # 4. Jumping one stair three times
18        return 4
19    else:
20        # You can reach your current stair from three different places:
21        # 1. From three stairs down
22        # 2. From two stairs down
23        # 2. From one stair down
24        #
25        # If you add up the number of ways of getting to those
26        # those three positions, then you should have your solution.
27        return (
28            steps_to(stair - 3)
29            + steps_to(stair - 2)
30            + steps_to(stair - 1)
31        )
32
33print(steps_to(4))
5. Lần thứ hai, mã không cần phải lấy lại mục từ máy chủ.

Chiến lược bộ nhớ đệm

Có một vấn đề lớn với việc triển khai bộ đệm này: Nội dung của từ điển sẽ phát triển vô thời hạn! Khi người dùng tải xuống nhiều bài viết hơn, ứng dụng sẽ tiếp tục lưu trữ chúng trong bộ nhớ, cuối cùng khiến ứng dụng bị sập.

Để giải quyết vấn đề này, bạn cần một chiến lược để quyết định bài viết nào nên ở trong bộ nhớ và nên loại bỏ. Các chiến lược lưu trữ này là các thuật toán tập trung vào việc quản lý thông tin được lưu trữ và chọn các mục nào để loại bỏ để nhường chỗ cho các mục mới.

Có một số chiến lược khác nhau mà bạn có thể sử dụng để trục xuất các mục từ bộ đệm và giữ cho nó không phát triển quá khứ từ kích thước tối đa của nó. Dưới đây là năm trong số những người phổ biến nhất, với lời giải thích khi mỗi người hữu ích nhất:

Chiến lượcChính sách trục xuấtSử dụng trường hợp
Đầu tiên/lần đầu tiên (FIFO)Đuổi những mục cũ nhất trong số các mụcCác mục mới hơn rất có thể được sử dụng lại
Lần cuối/lần đầu tiên (LIFO)Đuổi những mục mới nhất của các mụcCác mục cũ hơn rất có thể được sử dụng lại
Ít được sử dụng gần đây (LRU)Kiếm mục nhập ít được sử dụng gần đây nhấtCác mục được sử dụng gần đây rất có thể được sử dụng lại
Được sử dụng gần đây nhất (MRU)Đuổi mục được sử dụng gần đây nhấtCác mục được sử dụng gần đây nhất có khả năng được sử dụng lại
Ít được sử dụng nhất (LFU)Đuổi mục nhập ít nhất được truy cập ít nhấtCác mục có nhiều bản hit có nhiều khả năng được sử dụng lại

Trong các phần dưới đây, bạn sẽ xem xét kỹ hơn về chiến lược LRU và cách thực hiện nó bằng cách sử dụng nhà trang trí

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 từ mô -đun Python tựa
$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
7.

Lặn vào chiến lược bộ đệm ít được sử dụng gần đây nhất (LRU)

Một bộ đệm được triển khai bằng chiến lược LRU tổ chức các mục của nó theo thứ tự sử dụng. Mỗi khi bạn truy cập một mục nhập, thuật toán LRU sẽ di chuyển nó lên đầu bộ đệm. Bằng cách này, thuật toán có thể nhanh chóng xác định mục nhập mà Lừa không sử dụng lâu nhất bằng cách nhìn vào dưới cùng của danh sách.

Hình sau đây cho thấy biểu diễn bộ đệm giả thuyết sau khi người dùng của bạn yêu cầu một bài viết từ mạng:

Hướng dẫn python in-memory cache - bộ đệm trong bộ nhớ python

Lưu ý cách bộ đệm lưu trữ bài viết trong vị trí gần đây nhất trước khi phục vụ nó cho người dùng. Hình sau đây cho thấy những gì xảy ra khi người dùng yêu cầu bài viết thứ hai:

Hướng dẫn python in-memory cache - bộ đệm trong bộ nhớ python

Bài viết thứ hai lấy vị trí gần đây nhất, đẩy bài viết đầu tiên xuống danh sách.

Chiến lược LRU giả định rằng gần đây một đối tượng đã được sử dụng, càng có nhiều khả năng cần thiết trong tương lai, vì vậy nó cố gắng giữ đối tượng đó trong bộ đệm trong thời gian dài nhất.

Nhìn trộm phía sau hậu trường của bộ đệm LRU

Một cách để thực hiện bộ đệm LRU trong Python là sử dụng kết hợp danh sách được liên kết gấp đôi và bản đồ băm. Yếu tố đầu của danh sách được liên kết gấp đôi sẽ chỉ ra mục nhập được sử dụng gần đây nhất và đuôi sẽ chỉ ra mục nhập ít gần đây nhất.head element of the doubly linked list would point to the most recently used entry, and the tail would point to the least recently used entry.

Hình dưới đây cho thấy cấu trúc tiềm năng của việc triển khai bộ đệm LRU đằng sau hậu trường:

Hướng dẫn python in-memory cache - bộ đệm trong bộ nhớ python

Sử dụng bản đồ băm, bạn có thể đảm bảo quyền truy cập vào mọi mục trong bộ đệm bằng cách ánh xạ từng mục vào vị trí cụ thể trong danh sách được liên kết gấp đôi.

Chiến lược này rất nhanh. Truy cập mục ít nhất được sử dụng gần đây và cập nhật bộ đệm là các hoạt động với thời gian chạy O (1).

Kể từ phiên bản 3.2, Python đã bao gồm nhà trang trí

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 để thực hiện chiến lược LRU. Bạn có thể sử dụng trình trang trí này để bọc các chức năng và lưu trữ kết quả của chúng lên đến số lượng mục tối đa.

Sử dụng @lru_cache để thực hiện bộ đệm LRU trong Python

Giống như giải pháp bộ đệm mà bạn đã triển khai trước đó,

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 sử dụng từ điển đằng sau hậu trường. Nó lưu trữ kết quả của chức năng dưới một khóa bao gồm cuộc gọi đến hàm, bao gồm các đối số được cung cấp. Điều này rất quan trọng bởi vì nó có nghĩa là những lập luận này phải được băm cho người trang trí hoạt động.hashable for the decorator to work.

Chơi với cầu thang

Hãy tưởng tượng bạn muốn xác định tất cả các cách khác nhau mà bạn có thể đến một cầu thang cụ thể trong cầu thang bằng cách nhảy một, hai hoặc ba cầu thang cùng một lúc. Có bao nhiêu con đường đến cầu thang thứ tư? Dưới đây là tất cả các kết hợp khác nhau:

Hướng dẫn python in-memory cache - bộ đệm trong bộ nhớ python

Bạn có thể đóng khung một giải pháp cho vấn đề này bằng cách tuyên bố rằng, để đến cầu thang hiện tại của bạn, bạn có thể nhảy từ một cầu thang, hai cầu thang hoặc ba cầu thang bên dưới. Thêm số lượng kết hợp nhảy bạn có thể sử dụng để đạt được từng điểm đó sẽ cung cấp cho bạn tổng số cách có thể để đạt được vị trí hiện tại của bạn.

Ví dụ: số lượng kết hợp để đạt được cầu thang thứ tư sẽ bằng tổng số các cách khác nhau mà bạn có thể đạt được cầu thang thứ ba, thứ hai và thứ nhất:

Hướng dẫn python in-memory cache - bộ đệm trong bộ nhớ python

Như thể hiện trong hình, có bảy cách khác nhau để đến cầu thang thứ tư. Lưu ý cách giải pháp cho một cầu thang nhất định dựa trên các câu trả lời cho các vấn đề nhỏ hơn. Trong trường hợp này, để xác định các đường dẫn khác nhau đến cầu thang thứ tư, bạn có thể thêm bốn cách đến cầu thang thứ ba, hai cách đến cầu thang thứ hai và một cách đến cầu thang thứ nhất.

Cách tiếp cận này được gọi là đệ quy. Nếu bạn muốn tìm hiểu thêm, thì hãy kiểm tra suy nghĩ đệ quy trong Python để giới thiệu về chủ đề này.recursion. If you want to learn more, then check out Thinking Recursively in Python for an introduction to the topic.

Ở đây, một chức năng thực hiện đệ quy này:

 1def steps_to(stair):
 2    if stair == 1:
 3        # You can reach the first stair with only a single step
 4        # from the floor.
 5        return 1
 6    elif stair == 2:
 7        # You can reach the second stair by jumping from the
 8        # floor with a single two-stair hop or by jumping a single
 9        # stair a couple of times.
10        return 2
11    elif stair == 3:
12        # You can reach the third stair using four possible
13        # combinations:
14        # 1. Jumping all the way from the floor
15        # 2. Jumping two stairs, then one
16        # 3. Jumping one stair, then two
17        # 4. Jumping one stair three times
18        return 4
19    else:
20        # You can reach your current stair from three different places:
21        # 1. From three stairs down
22        # 2. From two stairs down
23        # 2. From one stair down
24        #
25        # If you add up the number of ways of getting to those
26        # those three positions, then you should have your solution.
27        return (
28            steps_to(stair - 3)
29            + steps_to(stair - 2)
30            + steps_to(stair - 1)
31        )
32
33print(steps_to(4))

Lưu mã này vào một tệp có tên

$ python stairs.py
53798080
0 và chạy nó bằng lệnh sau:

Tuyệt quá! Mã này hoạt động cho

$ python stairs.py
53798080
1 cầu thang, nhưng làm thế nào về việc đếm có bao nhiêu bước để đến một vị trí cao hơn trong cầu thang? Thay đổi số cầu thang trong dòng 33 thành
$ python stairs.py
53798080
2 và chạy lại tập lệnh:

$ python stairs.py
53798080

Wow, hơn 53 triệu kết hợp! Đó là rất nhiều hoa bia!

Thời gian mã của bạn

Khi tìm ra giải pháp cho cầu thang thứ ba mươi, kịch bản này mất khá nhiều thời gian để hoàn thành. Để có được một đường cơ sở, bạn có thể đo được thời gian để mã chạy.

Để thực hiện điều này, bạn có thể sử dụng mô -đun Python từ ____33. Thêm các dòng sau sau dòng 33:

35setup_code = "from __main__ import steps_to"
36stmt = "steps_to(30)"
37times = repeat(setup=setup_code, stmt=stmt, repeat=3, number=10)
38print(f"Minimum execution time: {min(times)}")

Bạn cũng cần nhập mô -đun

$ python stairs.py
53798080
3 ở đầu mã:

 1from timeit import repeat

Ở đây, một lời giải thích từng dòng về các bổ sung này:

  • Dòng 35 nhập tên của
    $ python stairs.py
    53798080
    
    5 để
    $ python stairs.py
    53798080
    
    6 biết cách gọi nó.
    imports the name of
    $ python stairs.py
    53798080
    
    5 so that
    $ python stairs.py
    53798080
    
    6 knows how to call it.
  • Dòng 36 chuẩn bị cuộc gọi đến hàm với số cầu thang bạn muốn tiếp cận, trong trường hợp này là
    $ python stairs.py
    53798080
    
    2. Đây là tuyên bố sẽ được thực thi và hẹn giờ.
    prepares the call to the function with the stair number you want to reach, which in this case is
    $ python stairs.py
    53798080
    
    2. This is the statement that will be executed and timed.
  • Dòng 37 gọi
    $ python stairs.py
    53798080
    
    6 với mã thiết lập và câu lệnh. Điều này sẽ gọi hàm
    $ python stairs.py
    53798080
    
    9 lần, trả về số giây mỗi lần thực hiện.
    calls
    $ python stairs.py
    53798080
    
    6 with the setup code and the statement. This will call the function
    $ python stairs.py
    53798080
    
    9 times, returning the number of seconds each execution took.
  • Dòng 38 xác định và in thời gian ngắn nhất được trả về. identifies and prints the shortest time returned.

Bây giờ chạy lại tập lệnh:

$ python stairs.py
53798080
Minimum execution time: 40.014977024000004

Số giây bạn sẽ thấy phụ thuộc vào phần cứng cụ thể của bạn. Trên hệ thống của tôi, kịch bản mất bốn mươi giây, khá chậm cho chỉ ba mươi cầu thang!

Một giải pháp mất nhiều thời gian này là một vấn đề, nhưng bạn có thể cải thiện nó bằng cách sử dụng ghi nhớ.

Sử dụng ghi nhớ để cải thiện giải pháp

Việc thực hiện đệ quy này giải quyết vấn đề bằng cách chia nó thành các bước nhỏ hơn xây dựng lẫn nhau. Hình sau đây cho thấy một cây trong đó mọi nút đại diện cho một cuộc gọi cụ thể đến

$ python stairs.py
53798080
5:

Hướng dẫn python in-memory cache - bộ đệm trong bộ nhớ python

Lưu ý cách bạn cần gọi

$ python stairs.py
53798080
5 với cùng một đối số nhiều lần. Ví dụ,
35setup_code = "from __main__ import steps_to"
36stmt = "steps_to(30)"
37times = repeat(setup=setup_code, stmt=stmt, repeat=3, number=10)
38print(f"Minimum execution time: {min(times)}")
2 được tính toán hai lần,
35setup_code = "from __main__ import steps_to"
36stmt = "steps_to(30)"
37times = repeat(setup=setup_code, stmt=stmt, repeat=3, number=10)
38print(f"Minimum execution time: {min(times)}")
3 được tính toán bốn lần,
35setup_code = "from __main__ import steps_to"
36stmt = "steps_to(30)"
37times = repeat(setup=setup_code, stmt=stmt, repeat=3, number=10)
38print(f"Minimum execution time: {min(times)}")
4 bảy lần và
35setup_code = "from __main__ import steps_to"
36stmt = "steps_to(30)"
37times = repeat(setup=setup_code, stmt=stmt, repeat=3, number=10)
38print(f"Minimum execution time: {min(times)}")
5 sáu lần. Gọi cùng một chức năng nhiều lần thêm các chu kỳ tính toán mà aren cần thiết, kết quả sẽ luôn giống nhau.

Để khắc phục vấn đề này, bạn có thể sử dụng một kỹ thuật gọi là ghi nhớ. Cách tiếp cận này đảm bảo rằng một hàm không chạy cho cùng một đầu vào nhiều lần bằng cách lưu trữ kết quả của nó vào bộ nhớ và sau đó tham chiếu nó sau khi cần thiết. Kịch bản này nghe có vẻ là cơ hội hoàn hảo để sử dụng Python từ

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 Trang trí!memoization. This approach ensures that a function doesn’t run for the same inputs more than once by storing its result in memory and then referencing it later when necessary. This scenario sounds like the perfect opportunity to use Python’s
$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 decorator!

Chỉ với hai thay đổi, bạn có thể cải thiện đáng kể thời gian chạy thuật toán:

  1. Nhập công cụ trang trí
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8 từ mô -đun
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    7.
  2. Sử dụng
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8 để trang trí
    $ python stairs.py
    53798080
    
    5.

Dưới đây, phần đầu của tập lệnh sẽ trông như thế nào với hai bản cập nhật:

 1from functools import lru_cache
 2from timeit import repeat
 3
 4@lru_cache
 5def steps_to(stair):
 6    if stair == 1:

Chạy tập lệnh được cập nhật tạo ra kết quả sau:

$ python stairs.py
53798080
Minimum execution time: 7.999999999987184e-07

Bộ nhớ đệm kết quả của chức năng mất thời gian chạy từ 40 giây xuống còn 0,0008 mili giây! Đó là một cải tiến tuyệt vời!

Hãy nhớ rằng, đằng sau hậu trường, người trang trí

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 lưu trữ kết quả của
$ python stairs.py
53798080
5 cho mỗi đầu vào khác nhau. Mỗi khi mã gọi hàm với cùng một tham số, thay vì tính toán một câu trả lời một lần nữa, nó sẽ trả về kết quả chính xác trực tiếp từ bộ nhớ. Điều này giải thích sự cải thiện lớn về hiệu suất khi sử dụng
$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8.

Giải nén chức năng của @lru_cache

Với bộ trang trí

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 tại chỗ, bạn lưu trữ mọi cuộc gọi và trả lời trong bộ nhớ để truy cập sau nếu được yêu cầu lại. Nhưng bạn có thể lưu bao nhiêu cuộc gọi trước khi hết bộ nhớ?

Nhà trang trí Python từ

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 cung cấp thuộc tính
 1from timeit import repeat
6 xác định số lượng mục tối đa trước khi bộ đệm bắt đầu đuổi các mặt hàng cũ. Theo mặc định,
 1from timeit import repeat
6 được đặt thành
 1from timeit import repeat
8. Nếu bạn đặt
 1from timeit import repeat
6 thành
$ python stairs.py
53798080
Minimum execution time: 40.014977024000004
0, thì bộ đệm sẽ phát triển vô thời hạn và không có mục nào sẽ bị trục xuất. Điều này có thể trở thành một vấn đề nếu bạn lưu trữ một số lượng lớn các cuộc gọi khác nhau trong bộ nhớ.

Ở đây, một ví dụ về

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 bằng cách sử dụng thuộc tính
 1from timeit import repeat
6:

 1from functools import lru_cache
 2from timeit import repeat
 3
 4@lru_cache(maxsize=16)
 5def steps_to(stair):
 6    if stair == 1:

Trong trường hợp này, bạn đã giới hạn bộ đệm đến tối đa các mục

$ python stairs.py
53798080
Minimum execution time: 40.014977024000004
3. Khi một cuộc gọi mới xuất hiện, việc triển khai trang trí của nhà trang trí sẽ trục xuất ít nhất được sử dụng gần đây của các mục
$ python stairs.py
53798080
Minimum execution time: 40.014977024000004
3 hiện có để tạo một vị trí cho mặt hàng mới.

Để xem điều gì xảy ra với sự bổ sung mới này vào mã này, bạn có thể sử dụng

$ python stairs.py
53798080
Minimum execution time: 40.014977024000004
5, được cung cấp bởi
$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8, để kiểm tra số lần truy cập và bỏ lỡ và kích thước hiện tại của bộ đệm. Để rõ ràng, hãy xóa mã thời gian chạy của hàm. Ở đây, cách mà tập lệnh cuối cùng chăm sóc tất cả các sửa đổi:hits and misses and the current size of the cache. For clarity, remove the code that times the runtime of the function. Here’s how the final script looks after all the modifications:

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
0

Nếu bạn gọi lại tập lệnh, thì bạn sẽ thấy kết quả sau:

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
1

Bạn có thể sử dụng thông tin được trả về bởi

$ python stairs.py
53798080
Minimum execution time: 40.014977024000004
5 để hiểu cách thức hoạt động của bộ đệm và tinh chỉnh nó để tìm sự cân bằng phù hợp giữa tốc độ và lưu trữ.

Ở đây, một sự cố của các thuộc tính được cung cấp bởi

$ python stairs.py
53798080
Minimum execution time: 40.014977024000004
5:

  • $ python stairs.py
    53798080
    Minimum execution time: 40.014977024000004
    
    9 là số lượng cuộc gọi mà
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8 đã trả lại trực tiếp từ bộ nhớ vì chúng tồn tại trong bộ đệm.
    is the number of calls that
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8 returned directly from memory because they existed in the cache.

  •  1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache
     5def steps_to(stair):
     6    if stair == 1:
    
    1 là số lượng cuộc gọi mà didn đến từ bộ nhớ và được tính toán. Vì bạn đang cố gắng tìm số bước để đến cầu thang thứ ba mươi, nên có ý nghĩa rằng mỗi cuộc gọi này đã bỏ lỡ bộ đệm ngay lần đầu tiên chúng được thực hiện. is the number of calls that didn’t come from memory and were computed. Since you’re trying to find the number of steps to reach the thirtieth stair, it makes sense that each of these calls missed the cache the first time they were made.

  •  1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache
     5def steps_to(stair):
     6    if stair == 1:
    
    2 là kích thước của bộ đệm như bạn đã định nghĩa với thuộc tính
     1from timeit import repeat
    
    6 của bộ trang trí.
    is the size of the cache as you defined it with the
     1from timeit import repeat
    
    6 attribute of the decorator.

  •  1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache
     5def steps_to(stair):
     6    if stair == 1:
    
    4 là kích thước hiện tại của bộ đệm. Trong trường hợp này, nó cho thấy bộ nhớ cache của bạn đã đầy. is the current size of the cache. In this case, it shows that your cache is full.

Nếu bạn cần xóa tất cả các mục từ bộ đệm, thì bạn có thể sử dụng

 1from functools import lru_cache
 2from timeit import repeat
 3
 4@lru_cache
 5def steps_to(stair):
 6    if stair == 1:
5 được cung cấp bởi
$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8.

Thêm hết hạn bộ nhớ cache

Hãy tưởng tượng bạn muốn phát triển một kịch bản theo dõi Python thực và in số lượng ký tự trong bất kỳ bài viết nào có chứa từ

 1from functools import lru_cache
 2from timeit import repeat
 3
 4@lru_cache
 5def steps_to(stair):
 6    if stair == 1:
7.

Real Python cung cấp một nguồn cấp dữ liệu nguyên tử, vì vậy bạn có thể sử dụng thư viện ____78 để phân tích thức ăn và thư viện

 1def steps_to(stair):
 2    if stair == 1:
 3        # You can reach the first stair with only a single step
 4        # from the floor.
 5        return 1
 6    elif stair == 2:
 7        # You can reach the second stair by jumping from the
 8        # floor with a single two-stair hop or by jumping a single
 9        # stair a couple of times.
10        return 2
11    elif stair == 3:
12        # You can reach the third stair using four possible
13        # combinations:
14        # 1. Jumping all the way from the floor
15        # 2. Jumping two stairs, then one
16        # 3. Jumping one stair, then two
17        # 4. Jumping one stair three times
18        return 4
19    else:
20        # You can reach your current stair from three different places:
21        # 1. From three stairs down
22        # 2. From two stairs down
23        # 2. From one stair down
24        #
25        # If you add up the number of ways of getting to those
26        # those three positions, then you should have your solution.
27        return (
28            steps_to(stair - 3)
29            + steps_to(stair - 2)
30            + steps_to(stair - 1)
31        )
32
33print(steps_to(4))
2 để tải nội dung của bài viết như bạn đã làm trước đây.

Ở đây, một triển khai của tập lệnh Monitor:

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
2

Lưu tập lệnh này vào một tệp có tên

$ python stairs.py
53798080
Minimum execution time: 7.999999999987184e-07
0, cài đặt thư viện
 1from functools import lru_cache
 2from timeit import repeat
 3
 4@lru_cache
 5def steps_to(stair):
 6    if stair == 1:
8 và
 1def steps_to(stair):
 2    if stair == 1:
 3        # You can reach the first stair with only a single step
 4        # from the floor.
 5        return 1
 6    elif stair == 2:
 7        # You can reach the second stair by jumping from the
 8        # floor with a single two-stair hop or by jumping a single
 9        # stair a couple of times.
10        return 2
11    elif stair == 3:
12        # You can reach the third stair using four possible
13        # combinations:
14        # 1. Jumping all the way from the floor
15        # 2. Jumping two stairs, then one
16        # 3. Jumping one stair, then two
17        # 4. Jumping one stair three times
18        return 4
19    else:
20        # You can reach your current stair from three different places:
21        # 1. From three stairs down
22        # 2. From two stairs down
23        # 2. From one stair down
24        #
25        # If you add up the number of ways of getting to those
26        # those three positions, then you should have your solution.
27        return (
28            steps_to(stair - 3)
29            + steps_to(stair - 2)
30            + steps_to(stair - 1)
31        )
32
33print(steps_to(4))
2 và chạy tập lệnh. Nó sẽ chạy liên tục cho đến khi bạn dừng nó bằng cách nhấn Ctrl+C trong cửa sổ đầu cuối của bạn:Ctrl+C in your terminal window:

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
3

Ở đây, một lời giải thích từng bước về mã:

  • Dòng 6 và 7: Đây là một giải pháp cho một vấn đề khi
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache
     5def steps_to(stair):
     6    if stair == 1:
    
    8 cố gắng truy cập nội dung được phục vụ qua HTTPS. Xem ghi chú dưới đây để biết thêm thông tin.
    : This is a workaround to an issue when
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache
     5def steps_to(stair):
     6    if stair == 1:
    
    8 tries to access content served over HTTPS. See the note below for more information.
  • Dòng 16:
    $ python stairs.py
    53798080
    Minimum execution time: 7.999999999987184e-07
    
    4 sẽ lặp lại vô thời hạn.
    :
    $ python stairs.py
    53798080
    Minimum execution time: 7.999999999987184e-07
    
    4 will loop indefinitely.
  • Dòng 18: Sử dụng
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache
     5def steps_to(stair):
     6    if stair == 1:
    
    8, mã tải và phân tích nguồn cấp dữ liệu từ Python thực.
    : Using
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache
     5def steps_to(stair):
     6    if stair == 1:
    
    8, the code loads and parses the feed from Real Python.
  • Dòng 20: Vòng lặp đi qua các mục
    $ python stairs.py
    53798080
    Minimum execution time: 7.999999999987184e-07
    
    6 đầu tiên trong danh sách.
    : The loop goes through the first
    $ python stairs.py
    53798080
    Minimum execution time: 7.999999999987184e-07
    
    6 entries on the list.
  • Các dòng 21 đến 31: Nếu từ
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache
     5def steps_to(stair):
     6    if stair == 1:
    
    7 là một phần của tiêu đề, thì mã in nó cùng với độ dài của bài viết.
    : If the word
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache
     5def steps_to(stair):
     6    if stair == 1:
    
    7 is part of the title, then the code prints it along with the length of the article.
  • Dòng 33: Mã ngủ trong
    $ python stairs.py
    53798080
    Minimum execution time: 7.999999999987184e-07
    
    6 giây trước khi tiếp tục.
    : The code sleeps for
    $ python stairs.py
    53798080
    Minimum execution time: 7.999999999987184e-07
    
    6 seconds before continuing.
  • Dòng 35: Dòng này khởi động quá trình giám sát bằng cách chuyển URL của nguồn cấp dữ liệu Python thực sự đến
    $ python stairs.py
    53798080
    Minimum execution time: 7.999999999987184e-07
    
    4.
    : This line kicks off the monitoring process by passing the URL of the Real Python feed to
    $ python stairs.py
    53798080
    Minimum execution time: 7.999999999987184e-07
    
    4.

Mỗi khi tập lệnh tải một bài viết, thông báo

 1def steps_to(stair):
 2    if stair == 1:
 3        # You can reach the first stair with only a single step
 4        # from the floor.
 5        return 1
 6    elif stair == 2:
 7        # You can reach the second stair by jumping from the
 8        # floor with a single two-stair hop or by jumping a single
 9        # stair a couple of times.
10        return 2
11    elif stair == 3:
12        # You can reach the third stair using four possible
13        # combinations:
14        # 1. Jumping all the way from the floor
15        # 2. Jumping two stairs, then one
16        # 3. Jumping one stair, then two
17        # 4. Jumping one stair three times
18        return 4
19    else:
20        # You can reach your current stair from three different places:
21        # 1. From three stairs down
22        # 2. From two stairs down
23        # 2. From one stair down
24        #
25        # If you add up the number of ways of getting to those
26        # those three positions, then you should have your solution.
27        return (
28            steps_to(stair - 3)
29            + steps_to(stair - 2)
30            + steps_to(stair - 1)
31        )
32
33print(steps_to(4))
3 được in vào bảng điều khiển. Nếu bạn để tập lệnh chạy đủ lâu, thì bạn sẽ thấy cách tin nhắn này xuất hiện nhiều lần, ngay cả khi tải cùng một liên kết.

Đây là một cơ hội tuyệt vời để lưu trữ nội dung của bài viết và tránh truy cập mạng cứ sau năm giây. Bạn có thể sử dụng trình trang trí

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8, nhưng điều gì xảy ra nếu nội dung của bài viết được cập nhật?

Lần đầu tiên bạn truy cập bài viết, người trang trí sẽ lưu trữ nội dung của nó và trả về cùng một dữ liệu mỗi lần sau đó. Nếu bài đăng được cập nhật, thì tập lệnh màn hình sẽ không bao giờ nhận ra nó vì nó sẽ kéo bản sao cũ được lưu trữ trong bộ đệm. Để giải quyết vấn đề này, bạn có thể đặt các mục lưu trữ bộ nhớ cache của mình để hết hạn.

Kỷ niệm các mục lưu trữ dựa trên cả thời gian và không gian

Nhà trang trí

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8 chỉ đuổi các mục hiện có khi có thêm không gian để lưu trữ danh sách mới. Với đủ không gian, các mục trong bộ đệm sẽ sống mãi mãi và không bao giờ được làm mới.

Điều này trình bày một vấn đề cho tập lệnh giám sát của bạn vì bạn sẽ không bao giờ tìm nạp các bản cập nhật được xuất bản cho các bài viết được lưu trong bộ nhớ cache trước đó. Để giải quyết vấn đề này, bạn có thể cập nhật triển khai bộ đệm để hết hạn sau một thời gian cụ thể.

Bạn có thể thực hiện ý tưởng này thành một nhà trang trí mới mở rộng

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
8. Nếu người gọi cố gắng truy cập vào một mục mà qua đời, thì bộ đệm đã giành được nội dung của nó, buộc người gọi phải lấy bài viết từ mạng.

Ở đây, một triển khai có thể của người trang trí mới này:

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
4

Ở đây, một sự cố của việc thực hiện này:

  • Dòng 4: Bộ trang trí
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache(maxsize=16)
     5def steps_to(stair):
     6    if stair == 1:
    
    4 sẽ hỗ trợ thời gian tồn tại của các mục trong bộ đệm (tính bằng giây) và kích thước tối đa của bộ đệm.
    : The
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache(maxsize=16)
     5def steps_to(stair):
     6    if stair == 1:
    
    4 decorator will support the lifetime of the entries in the cache (in seconds) and the maximum size of the cache.
  • Dòng 6: Mã kết thúc chức năng được trang trí với bộ trang trí
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache(maxsize=16)
     5def steps_to(stair):
     6    if stair == 1:
    
    5. Điều này cho phép bạn sử dụng chức năng bộ đệm đã được cung cấp bởi
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache(maxsize=16)
     5def steps_to(stair):
     6    if stair == 1:
    
    5.
    : The code wraps the decorated function with the
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache(maxsize=16)
     5def steps_to(stair):
     6    if stair == 1:
    
    5 decorator. This allows you to use the cache functionality already provided by
     1from functools import lru_cache
     2from timeit import repeat
     3
     4@lru_cache(maxsize=16)
     5def steps_to(stair):
     6    if stair == 1:
    
    5.
  • Dòng 7 và 8: Hai dòng này Chức năng được trang trí với hai thuộc tính đại diện cho tuổi thọ của bộ đệm và ngày thực tế khi nó sẽ hết hạn.: These two lines instrument the decorated function with two attributes representing the lifetime of the cache and the actual date when it will expire.
  • Các dòng 12 đến 14: Trước khi truy cập một mục trong bộ đệm, người trang trí kiểm tra xem ngày hiện tại có quá hết hạn hay không. Nếu đó là trường hợp, thì nó sẽ xóa bộ đệm và sắp xếp lại thời gian tồn tại và ngày hết hạn.: Before accessing an entry in the cache, the decorator checks whether the current date is past the expiration date. If that’s the case, then it clears the cache and recomputes the lifetime and expiration date.

Lưu ý làm thế nào, khi một mục nhập hết hạn, bộ trang trí này sẽ xóa toàn bộ bộ đệm liên quan đến chức năng. Trọn đời áp dụng cho toàn bộ bộ đệm, không phải cho các bài viết riêng lẻ. Một triển khai tinh vi hơn của chiến lược này sẽ đuổi các mục dựa trên cuộc sống cá nhân của họ.

Bộ nhớ đệm bài viết với người trang trí mới

Bây giờ bạn có thể sử dụng trình trang trí

 1from functools import lru_cache
 2from timeit import repeat
 3
 4@lru_cache(maxsize=16)
 5def steps_to(stair):
 6    if stair == 1:
4 mới của mình với tập lệnh
 1from functools import lru_cache
 2from timeit import repeat
 3
 4@lru_cache(maxsize=16)
 5def steps_to(stair):
 6    if stair == 1:
8 để ngăn chặn nội dung của một bài viết mỗi khi bạn truy cập nó.

Đặt mã với nhau trong một tập lệnh duy nhất để đơn giản, bạn kết thúc với các mục sau:

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
5

Lưu ý cách dòng 30 trang trí

 1from functools import lru_cache
 2from timeit import repeat
 3
 4@lru_cache(maxsize=16)
 5def steps_to(stair):
 6    if stair == 1:
9 với
 1from functools import lru_cache
 2from timeit import repeat
 3
 4@lru_cache(maxsize=16)
 5def steps_to(stair):
 6    if stair == 1:
4 và chỉ định tính hợp lệ của
$ python stairs.py
53798080
9 giây. Bất kỳ nỗ lực nào để truy cập cùng một bài viết từ máy chủ trong vòng
$ python stairs.py
53798080
9 giây sau khi lấy được, nó sẽ trả về nội dung từ bộ đệm và không bao giờ nhấn vào mạng.

Chạy tập lệnh và xem kết quả:

$ pip install requests
$ python caching.py
Getting article...
Fetching article from server...
Getting article...
6

Lưu ý cách mã in thông báo

 1def steps_to(stair):
 2    if stair == 1:
 3        # You can reach the first stair with only a single step
 4        # from the floor.
 5        return 1
 6    elif stair == 2:
 7        # You can reach the second stair by jumping from the
 8        # floor with a single two-stair hop or by jumping a single
 9        # stair a couple of times.
10        return 2
11    elif stair == 3:
12        # You can reach the third stair using four possible
13        # combinations:
14        # 1. Jumping all the way from the floor
15        # 2. Jumping two stairs, then one
16        # 3. Jumping one stair, then two
17        # 4. Jumping one stair three times
18        return 4
19    else:
20        # You can reach your current stair from three different places:
21        # 1. From three stairs down
22        # 2. From two stairs down
23        # 2. From one stair down
24        #
25        # If you add up the number of ways of getting to those
26        # those three positions, then you should have your solution.
27        return (
28            steps_to(stair - 3)
29            + steps_to(stair - 2)
30            + steps_to(stair - 1)
31        )
32
33print(steps_to(4))
3 lần đầu tiên truy cập các bài viết phù hợp. Sau đó, tùy thuộc vào tốc độ mạng và sức mạnh tính toán của bạn, tập lệnh sẽ lấy các bài viết từ bộ đệm một hoặc hai lần trước khi nhấn lại máy chủ.

Kịch bản cố gắng truy cập các bài viết cứ sau

$ python stairs.py
53798080
Minimum execution time: 7.999999999987184e-07
6 giây và bộ nhớ cache hết hạn cứ sau mỗi
$ python stairs.py
53798080
9 giây. Những thời điểm này có lẽ quá ngắn cho một ứng dụng thực sự, vì vậy bạn có thể có được một cải tiến đáng kể bằng cách điều chỉnh các cấu hình này.

Sự kết luận

Bộ nhớ đệm là một kỹ thuật tối ưu hóa thiết yếu để cải thiện hiệu suất của bất kỳ hệ thống phần mềm nào. Hiểu cách thức hoạt động của bộ nhớ đệm là một bước cơ bản để kết hợp nó một cách hiệu quả trong các ứng dụng của bạn.

Trong hướng dẫn này, bạn đã học được:

  • Các chiến lược bộ đệm khác nhau là gì và cách chúng hoạt độngcaching strategies are and how they work
  • Cách sử dụng người trang trí Python từ
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8
    decorator
  • Cách tạo một bộ trang trí mới để mở rộng chức năng của
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8create a new decorator to extend the functionality of
    $ pip install requests
    $ python caching.py
    Getting article...
    Fetching article from server...
    Getting article...
    
    8
  • Cách đo thời gian chạy mã của bạn bằng cách sử dụng mô -đun
    $ python stairs.py
    53798080
    
    3runtime using the
    $ python stairs.py
    53798080
    
    3 module
  • Đệ quy là gì và làm thế nào để giải quyết một vấn đề bằng cách sử dụng nórecursion is and how to solve a problem using it
  • Cách ghi nhớ cải thiện thời gian chạy bằng cách lưu trữ kết quả trung gian trong bộ nhớmemoization improves runtime by storing intermediate results in memory

Bước tiếp theo để thực hiện các chiến lược bộ đệm khác nhau trong các ứng dụng của bạn là xem xét mô -đun ____10109. Thư viện này cung cấp một số bộ sưu tập và trang trí bao gồm một số chiến lược bộ đệm phổ biến nhất mà bạn có thể bắt đầu sử dụng ngay lập tức.

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Bộ đệm trong Python với LRU_CACHE This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Caching in Python With lru_cache