ĐỀ TÀI: “ Một số phương pháp tối ưu hóa mã nguồn Python giúp cảithiện hiệu suất chương trình và giảm tải tài nguyên” PHẦN I.. Ngoài Python thì C++ cũng là ngôn ngữ lập trình hiện nay rất
Trang 1TÀI NGUYÊN Lĩnh vực: Tin học
Người thực hiện: Nguyễn Hồng Dương
Số điện thoại: 0357563745
Năm thực hiện: 2023 - 2024
Năm học: 2023 – 2024
Trang 2MỤC LỤC
Trang
PHẦN I: ĐẶT VẤN ĐỀ 2
1 Lý do chọn đề tài 2
2 Mục tiêu nghiên cứu của đề tài 3
3 Nhiệm vụ nghiên cứu của đề tài 3
4 Đối tượng nghiên cứu của đề tài 3
5 Phạm vi nghiên cứu của đề tài 3
6 Tính mới của đề tài 3
PHẦN II: NỘI DUNG NGHIÊN CỨU 4
1 Cơ sở lý luận 4
1.1 Giới thiệu 4
1.1.1 Con trỏ là gì? 4
1.1.2 Làm thế nào để sử dụng thuật toán hai con trỏ? 5
1.2 Một số dạng về thuật toán hai con trỏ 6
1.2.1 Hai con trỏ, một con trỏ ở đầu và một con trỏ ở cuối di chuyển vào giữa cho đến khi cả 2 gặp nhau 6
1.2.2 Một con trỏ di chuyển chậm và một con trỏ di chuyển với tốc độ nhanh hơn 9 1.2.3 Hai con trỏ di chuyển trên hai mảng hoặc xâu 11
2 Cơ sở thực tiễn 15
2.1 Thực trạng của vấn đề trước khi áp dụng đề tài 15
2.1.1 Đặc điểm tình hình 15
2.1.2 Thực trạng trước khi nghiên cứu 16
2.1.3 Các giải pháp giải quyết vấn đề 17
2.2 So sánh cài đặt thuật toán 2 con trỏ và một số thuật toán khác 17
2.3 Rèn luyện kỹ năng vận dụng thuật toán 2 con trỏ để giải một số bài toán cơ bản đến nâng cao 28
2.3.1 Một số bài tập về 2 con trỏ, một con trỏ ở đầu và một con trỏ ở cuối di chuyển vào giữa cho đến khi cả 2 gặp 28
2.3.2 Một số bài tập về một con trỏ di chuyển chậm và một con trỏ di chuyển với tốc độ nhanh hơn 31
2.3.3 Hai con trỏ di chuyển trên hai mảng hoặc xâu 36
2.4 Bài tập tự giải có hướng dẫn 41
PHẦN III: KẾT LUẬN 48
1 Với mục tiêu đề ra đề tài đã làm được 48
2 Hướng phát triển của đề tài 48
3 Kiến nghị và đề xuất 48
TÀI LIỆU THAM KHẢO 50
Trang 3ĐỀ TÀI: “ Một số phương pháp tối ưu hóa mã nguồn Python giúp cải
thiện hiệu suất chương trình và giảm tải tài nguyên”
PHẦN I ĐẶT VẤN ĐỀ
1.1 Lí do chọn đề tài
Cuộc cách mạng công nghệ 4.0 đã và đang làm thay đổi mọi lĩnh vực khoa học
và đời sống Các ngành nghề dựa vào thành quả của lĩnh vực công nghệ cao nhưCông nghệ Nano, Công nghệ Sinh học và đặc biệt là Công nghệ Thông tin ngày càngphát triển vượt bậc cả về lượng lẫn về chất Để góp phần cho ngành Công nghệthông tin có ảnh hưởng mạnh mẽ như vậy, thì việc lựa chọn ngôn ngữ lập trìnhtrong các lĩnh vực mũi nhọn như Trí tuệ nhân tạo (AI), học máy (Machine Learning),khai phá dữ liệu (Data Mining), học sâu (Deep Learning) trở nên vô cùng quan trọng
và cần thiết Một trong những ngôn ngữ đáp ứng được hầu hết các tiêu chí của tất cảnhà lập trình khó tính nhất đó chính là ngôn ngữ lập trình Python
Ngôn ngữ lập trình Python có nhiều ưu điểm nổi trội như dễ nhớ, dễ viết, khảnăng xử lí số liệu lớn, phức tạp rất tốt, thư viện có nhiều hàm, đáp ứng được nhiềukiểu dữ liệu mới của Machine Learning, AI, Data Mining, Deep Learning Ngày nay,máy tính có khả năng tự học mà không cần phải lập trình một cách rõ ràng NgànhKhoa học máy tính hiện có nhiều ứng dụng sâu rộng vào cuộc sống hằng ngày nhưđánh cờ, nhận diện khuôn mặt, chẩn đoán y khoa, phát hiện thẻ tín dụng giả, dự đoánkết quả trận đấu, nhận diện giọng nói, phân loại các chuẩn DNA, tóm tắt văn bản, trảlời tự động,… Chính vì thế, ngôn ngữ lập trình Python giờ đã trở thành một yếu tốkhông thể thiếu khi nhắc đến AI, Machine Learning, Data Mining, Deep Learning vàngược lại
Ngôn ngữ lập trình Python vừa đáp ứng được yêu cầu của các bài toán lập trình
cổ điển trước đây và các bài toán lập trình mới Tuy nhiên, các tài liệu về lập trìnhPython ở nước ta còn thiếu Đó là rào cản lớn cho những người muốn sử dụng ngônngữ này trong lập trình Ngoài ra, Trong chương trình giáo dục phổ thông 2018 thìngôn ngữ lập trình pascal không được đưa vào dạy học thay vào đó là ngôn ngữ lậptrình Python Ngoài Python thì C++ cũng là ngôn ngữ lập trình hiện nay rất phổ biếntrong chương trình dạy học cũng như tính ứng dụng của 2 ngôn ngữ này rất nhiều,nhất là trong các kỳ thi tin học trẻ, thi vào chuyên tin, học sinh giỏi tỉnh…
Bên cạnh đó ngôn ngữ lập trình Python thường được biết đến với sự thuận lợitrong việc đọc và viết mã, nhưng đôi khi nó cũng có thể chạy chậm so với một sốngôn ngữ khác Dưới đây là một số nguyên nhân chính làm cho Python có thể chạychậm:
- Ngôn ngữ thông dịch (interpreted language):
Python được thực thi dưới dạng thông dịch, điều này có thể làm giảm hiệu suất
Trang 4so với các ngôn ngữ được biên dịch trước khi chạy Trong quá trình thực thi, Pythoncần dịch mã nguồn thành mã máy tại thời điểm chạy, làm tăng độ trễ.
- Dynamic typing:
Sự đa dạng về kiểu dữ liệu có thể tạo ra độ trễ trong quá trình kiểm tra kiểu dữliệu tại thời điểm thực thi Mỗi khi một biến được sử dụng, Python phải kiểm tra kiểu
dữ liệu của nó và thích ứng với thay đổi kiểu
- Global Interpreter Lock (GIL):
GIL là một cơ chế bảo vệ ngăn chặn nhiều luồng Python chạy đồng thời trongmôi trường đa luồng Điều này có thể làm giảm hiệu suất đặc biệt đối với các ứngdụng đa luồng, vì chỉ một luồng được thực hiện tại một thời điểm, giảm tính songsong của chương trình
- Thuật toán quản lý bộ nhớ:
Python sử dụng garbage collection (thu gom rác) để tự động giải phóng bộ nhớkhông sử dụng, nhưng quá trình này có thể tạo ra độ trễ và làm giảm hiệu suất củachương trình, đặc biệt là trong các ứng dụng đòi hỏi xử lý nhanh
- Thư viện lớn và đa dạng:
Mặc dù thư viện đa dạng của Python là một điểm mạnh, nhưng đôi khi việc sửdụng quá nhiều thư viện có thể tăng kích thước của ứng dụng và làm chậm quá trìnhtải và khởi chạy
- Tự động kiểm tra lỗi (dynamic error checking):
Python thực hiện nhiều kiểm tra lỗi tại thời điểm chạy, điều này có thể làm chậmchương trình so với các ngôn ngữ có kiểm tra lỗi tại thời điểm biên dịch
- Các thư viện tham số nặng:
Trong các lĩnh vực như machine learning và scientific computing, một số thưviện Python có thể có tham số nặng và phức tạp, làm giảm hiệu suất đặc biệt đối vớicác tác vụ tính toán lớn
Các vấn đề trên không đồng nghĩa với việc Python không phù hợp cho mọi ứngdụng Python thường được chọn lựa cho tính dễ đọc, đồng nhất, và tích hợp tốt vớinhiều thư viện, trong khi vẫn có những nỗ lực để tối ưu hóa hiệu suất của nó thôngqua các dự án và cải tiến kỹ thuật
Trong đề tài này, tôi chủ yếu tập trung khai thác những hạn chế của ngôn ngữPython và trên cơ sở đó tìm ra các giải pháp mới giúp học sinh trong quá trình họccũng như trong các cuộc thi tin học trẻ, thi học sinh giỏi tỉnh, cải thiện tốc độ xử lýchương trình Do đó, tôi quyết định viết sáng kiến kinh nghiệm: “ Một số phương
pháp tối ưu hóa mã nguồn Python giúp cải thiện hiệu suất chương trình và giảm tải tài nguyên”
Để hoàn thành nhiệm vụ của đề tài, tôi đã nghiên cứu rất nhiều sách và các
Trang 5chuyên đề Tin học dành cho học sinh giỏi, các tài liệu trên các trang web Tuy nhiênrất ít tài liệu trình bày cụ thể về cách sử dụng thuật toán này một cách đầy đủ và dễhiểu.
1.2 Mục tiêu và nhiệm vụ nghiên cứu
1.2.1 Mục tiêu nghiên cứu
- Đề tài nêu ra các định hướng giúp học sinh có thể tiếp cận một số cách tối ưuhóa mã nguồn để tăng tốc độ xử lý chương trình
- Giúp học sinh tiếp cận ngôn ngữ lập trình Python sớm và tốt hơn
- Từ đó bồi dưỡng học sinh năng lực giải quyết vấn đề trong giải toán Tin học,đồng thời rèn luyện và nâng cao kĩ năng lập trình cho các em Đặc biệt là học sinhtham gia dự thi học sinh giỏi cấp tỉnh THCS, THPT hoặc thi vào các trường chuyên
1.2.2 Nhiệm vụ nghiên cứu.
- Đề tài phân tích một số thư viện, hàm và tối ưu hóa các thuật toán trong cácdạng toán quen thuộc, so sánh độ phức tạp thuật toán và định hướng lựa chọn thuậttoán tối ưu trong các trường hợp dữ liệu cụ thể nhằm giải bài toán hiệu quả nhất
- Minh họa bằng các ví dụ cụ thể Đồng thời liên hệ các đề thi vào trườngchuyên, đề thi học sinh giỏi tỉnh thời gian qua
1.3 Đối tượng và phạm vi nghiên cứu.
1.3.1 Đối tượng nghiên cứu.
- Độ phức tạp thuật toán và giải pháp lựa chọn các thư viện và thuật toán tối ưu
để cải thiện hiệu suất chương trình và giảm tải tài nguyên trong các dạng bài toánquen thuộc trên ngôn ngữ lập trình Python
- Phương pháp bồi dưỡng năng lực giải quyết vấn đề cho học sinh
1.3.2 Phạm vi nghiên cứu.
Chương trình Tin học THCS, THPT để bồi dưỡng học sinh giỏi Tin học vàthi vào trường chuyên THPT
1.4 Tính mới của đề tài.
Việc nghiên cứu về các phương pháp cải thiện mã nguồn Python để tăng hiệusuất chương trình và giảm tải tài nguyên trên máy tính là một đề tài còn mới mẻ chưađược đề cập nhiều trong các sách báo và trong các buổi tập huấn chuyên môn mà tôiđược tập huấn Trong các buổi tập huấn giảng viên chưa nêu cụ thể được các phươngpháp để ngôn ngữ Python chạy nhanh hơn so với ngôn ngữ C++ Đây là một hạn chếrất lớn ảnh hưởng đến kết quả trong các cuộc thi học sinh giỏi cấp tỉnh và các cuộcthi khác
Đề tài đã nêu được một số biện pháp mới và có các ví dụ minh họa đơn giản, dễhiểu cho người đọc nhất là đối với các đối tượng mới tiếp xúc với ngôn ngữ Python
Trang 6Tối ưu hóa mã nguồn không chỉ là quá trình cải thiện hiệu suất của chương trình
mà còn là một quá trình sáng tạo, đòi hỏi sự sáng tạo và chiến lược trong việc cânnhắc giữa các yếu tố như đọc hiểu mã, bảo trì, và hiệu suất thực thi
PHẦN II: NỘI DUNG NGHIÊN CỨU
1 Cơ sở lý luận
Trong quá trình ôn luyện đội tuyển, học sinh được dạy khá nhiều về các phươngpháp tối ưu thuật toán như: phương pháp tham lam, chia để trị (sắp xếp nhanh, chặtnhị phân…), quay lui, quy hoạch động, Z Algorithm, KMP… Nhưng nếu không biếtkết hợp với những kỹ thuật khác, không biết cách tổ chức dữ liệu, những phươngpháp này xét về phương diện độc lập sẽ không đạt được sự tối ưu cao nhất và không
có ý nghĩa
Các phương pháp được giới thiệu trong sáng kiến đều là những phương pháp rất
cơ bản, đơn giản và rất dễ tiếp cận đồng thời đem lại một hiệu quả rất đáng kể trongviệc giảm độ phức tạp thuật toán, tiến tới một thuật toán tối ưu nhất và quan trọngnhất là giúp chương trình viết bằng ngôn ngữ Python chạy nhanh hơn một cách đángkể
2 Cơ sở thực tiễn
Trên thực tế đã có một số tài liệu đề cập đến những kỹ thuật để tăng tốc chươngtrình, tuy nhiên chưa đi sâu vào phân tích cách tư duy, cách lựa chọn và cài đặtchương trình tối ưu, đặc biệt việc tổng hợp lại các phương pháp giúp học sinh có thể
so sánh các cách giải, các kết quả, độ phức tạp còn rất ít, hệ thống bài tập cũng khôngnhiều
3 Nội dung
3.1 Phương pháp sử dụng các thư viện tối ưu.
Python có nhi u th vi n đ c vi t b ng C, nh NumPy và Pandas, choề ư ệ ượ ế ằ ưphép th c hi n các phép toán s h c và x lý d li u nhanh chóng S d ng cácự ệ ố ọ ử ữ ệ ử ụ
th vi n này có th giúp tăng t c đ ch ng trình.ư ệ ể ố ộ ươ
Thay vì t vi t mã t đ u, s d ng các th vi n đã đ c t i u hóa b ng Cự ế ừ ầ ử ụ ư ệ ượ ố ư ằ
nh NumPy cho các phép toán s h c và Pandas cho x lý d li u.ư ố ọ ử ữ ệ
arr1d = np.array([1, 2, 3, 4, 5]) # T o m t m ng 1 chi u ạ ộ ả ề
arr2d = np.array([[1, 2, 3], [4, 5, 6]]) # T o m t m ng 2 chi u ạ ộ ả ề
# T o m t m ng v i giá tr tăng d n ạ ộ ả ớ ị ầ
Trang 7arr_range = np.arange(0, 10, 2) # T 0 đ n 10, b c nh y là 2 ừ ế ướ ả
print("T ng c a các ph n t trong m ng là:", total)ổ ủ ầ ử ả
Bài t p 2: ậ Ma tr n và tích vô h ngậ ướ
Cho hai ma tr n matrix1 và matrix2 Hãy tính tích vô h ng c a chúng và inậ ướ ủ
k t qu ra màn hình.ế ả
import numpy as np
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
dot_product = np.dot(matrix1, matrix2)
print("Tích vô h ng c a hai ma tr n là:\n", dot_product)ướ ủ ậ
Trang 8Bài t p 4: ậ T o m ng v i giá tr ng u nhiênạ ả ớ ị ẫ
T o m t m ng 2D có kích th c 3x3 v i các ph n t là các s ng u nhiênạ ộ ả ướ ớ ầ ử ố ẫtrong kho ng t 0 đ n 1 và in m ng ra màn hình.ả ừ ế ả
# Tính toán trên m ng nhi u chi u ả ề ề
arr_sum_axis0 = np.sum(arr2d, axis=0) # Tính t ng theo c t ổ ộ
arr_sum_axis1 = np.sum(arr2d, axis=1) # Tính t ng theo hàng ổ
3.1.2.Th vi n ư ệ Cython:
Cython là m t ngôn ng m r ng c a Python cho phép vi t mã C ho c C++ộ ữ ở ộ ủ ế ặ
t i u hóa và tích h p nó v i mã ngu n Python Nó giúp tăng hi u su t c a mãố ư ợ ớ ồ ệ ấ ủngu n thông qua vi c biên d ch mã ngu n Python thành mã máy t i u.ồ ệ ị ồ ố ư
Cách cài đ t Cython đ t i u hóa m t hàm ặ ể ố ư ộ
- Cài đ t Cython: ặ Tr c tiên, b n c n cài đ t Cython B n có th cài đ t nóướ ạ ầ ặ ạ ể ặthông qua pip b ng cách ch y l nh sau trong terminal ho c command prompt:ằ ạ ệ ặ pip install cython
- T o t p pyx: ạ ệ B n c n t o m t t p có ph n m r ng là pyx ch a mãạ ầ ạ ộ ệ ầ ở ộ ứCython c a b n Đây là n i b n sẽ vi t mã t ng t nh Python, nh ng b nủ ạ ơ ạ ế ươ ự ư ư ạcũng có th s d ng các tính năng c a Cython đ t i u hóa mã c a mình.ể ử ụ ủ ể ố ư ủ
- Biên d ch t p pyx: ị ệ B n c n biên d ch t p pyx thành mã C b ng Cython.ạ ầ ị ệ ằ
B n có th làm đi u này b ng cách ch y l nh sau trong terminal ho cạ ể ề ằ ạ ệ ặcommand prompt:
cythonize -i your_file.pyx #Trong đó, your_file.pyx là tên c a t p pyx c a ủ ệ ủ
b n ạ
- S d ng module đã đ ử ụ ượ c biên d ch: ị Sau khi biên d ch, m t t p c sẽị ộ ệ
đ c t o ra, cùng v i m t t p m r ng so (ho c pyd trên Windows) B n cóượ ạ ớ ộ ệ ở ộ ặ ạ
th nh p module này vào Python và s d ng các ch c năng và l p đ c đ nhể ậ ử ụ ứ ớ ượ ị
Trang 9nghĩa trong đó gi ng nh b n nh p b t kỳ module Python nào khác.ố ư ạ ậ ấ
Trong ví d này, chúng ta đã s d ng Cython đ t o m t hàm sum_up_to_nụ ử ụ ể ạ ộ
hi u qu h n cho vi c tính t ng các s t 1 đ n n Đi u này giúp tăng t c đệ ả ơ ệ ổ ố ừ ế ề ố ộtính toán so v i vi c s d ng m t hàm Python thông th ng.ớ ệ ử ụ ộ ườ
th c hi n đ n m t hàm đ c trang trí b ng Numba, nó sẽ đ c biên d ch thànhự ệ ế ộ ượ ằ ượ ị
mã máy “đúng lúc” đ th c thi và sau đó t t c ho c m t ph n mã c a b n cóể ự ấ ả ặ ộ ầ ủ ạ
th ch y t c đ mã máy g c!ể ạ ở ố ộ ố
Numba là m t th vi n giúp t i u hóa mã Python thông qua vi c biên d chộ ư ệ ố ư ệ ịcác hàm thành mã máy JIT (Just-In-Time) Numba th ng thích h p cho cácườ ợphép toán s h c và các vòng l p.ố ọ ặ
Ví d : ụ
from numba import jit
@jit(nopython=True)
Trang 10print("Sum result:", sum_of_list(numbers))
Bài t p 2: Tính t ng c a dãy Fibonacci ậ ổ ủ
Vi t m t ch ng trình s d ng th vi n Numba đ tính t ng c a n sế ộ ươ ử ụ ư ệ ể ổ ủ ốFibonacci đ u tiên, trong đó n đ c nh p t bàn phím.ầ ượ ậ ừ
G i ý: - ợ S d ng decorator @jit đ t i u hóa hàm tính s Fibonacci.ử ụ ể ố ư ố
print(f"T ng c a {n} s Fibonacci là: {total}")ổ ủ ố
3.2 Phương pháp sử dụng các cấu trúc dữ liệu hiệu quả.
3.2.1 Ph ươ ng pháp S d ng SET ử ụ
Trang 11S d ng set thay vì list trong Python có th mang l i nhi u l i ích, nh t làử ụ ể ạ ề ợ ấkhi b n c n lo i b các ph n t trùng l p ho c quan tâm đ n vi c ki m tra sạ ầ ạ ỏ ầ ử ặ ặ ế ệ ể ự
t n t i c a m t ph n t trong t p h p m t cách hi u quồ ạ ủ ộ ầ ử ậ ợ ộ ệ ảS d ng set thay vìử ụlist đ ki m tra s t n t i nhanh h n n u b n ch quan tâm đ n tính t n t iể ể ự ồ ạ ơ ế ạ ỉ ế ồ ạ
c a ph n t và không c n th t ủ ầ ử ầ ứ ự
Cách s d ng set nh sau: ử ụ ư
1 Kh i t o m t set: ở ạ ộ my_set = {1, 2, 3, 4, 5}
ho c s d ng hàm set():ặ ử ụ my_set = set([1, 2, 3, 4, 5])
2 Thêm ph n t vào set: ầ ử my_set.add(6)
3 Lo i b ph n t kh i set: ạ ỏ ầ ử ỏ my_set.remove(3)
4 Ki m tra s t n t i c a ph n t trong set: ể ự ồ ạ ủ ầ ử
if 4 in my_set:
print("4 có trong set.")
5 L y đ dài c a set: ấ ộ ủ length = len(my_set)
6 K t h p hai set: ế ợ
set1 = {1, 2, 3}
set2 = {3, 4, 5}
union_set = set1.union(set2)
7 Giao c a hai set: ủ intersection_set = set1.intersection(set2)
8 Hi u c a hai set: ệ ủ difference_set = set1.difference(set2)
9 Ki m tra set con ho c set cha: ể ặ
11 Xóa t t c ph n t trong set: ấ ả ầ ử my_set.clear()
Chú ý: Nh r ng các ph n t trong set là duy nh t và không theo th t ,ớ ằ ầ ử ấ ứ ự
đi u này có th d n đ n th t khác nhau khi b n in set.ề ể ẫ ế ứ ự ạ
Bài t p minh h a: ậ ọ
Bài t p 1: Tính t ng c a các ph n t duy nh t ậ ổ ủ ầ ử ấ
Vi t m t hàm nh n vào m t danh sách và tr v t ng c a các ph n t ế ộ ậ ộ ả ề ổ ủ ầ ử duy nh t trong danh sách ấ
Trang 12Bài t p 2: Ki m tra hai set có ph n t chung hay không ậ ể ầ ử
Vi t m t hàm nh n vào hai set và tr v True n u chúng có ít nh t m tế ộ ậ ả ề ế ấ ộ
ph n t chung, ng c l i tr v False.ầ ử ượ ạ ả ề
def has_common_element(set1, set2):
Bài t p 3: Đ m s l n xu t hi n c a m i ph n t trong danh sách ậ ế ố ầ ấ ệ ủ ỗ ầ ử
Vi t m t hàm nh n vào m t danh sách và tr v m t t đi n, trong đó keyế ộ ậ ộ ả ề ộ ừ ể
là ph n t và value là s l n xu t hi n c a ph n t đó trong danh sách.ầ ử ố ầ ấ ệ ủ ầ ử
collections module trong Python cung c p các l p đ c bi t h u ích h n so v iấ ớ ặ ệ ữ ơ ớ
Trang 13các ki u d li u c b n nh list, tuple, set và dict D i đây là m t s cách sể ữ ệ ơ ả ư ướ ộ ố ử
d ng các l p quan tr ng trong collections module:ụ ớ ọ
1 Counter: Đ m s l n xu t hi n c a các ph n t trong iterable.ế ố ầ ấ ệ ủ ầ ử
- “Counter” là m t subclass c a dict cung c p công c m nh mẽ cho vi cộ ủ ấ ụ ạ ệ
đ m đ i t ng không ch trong danh sách mà còn trong b t kỳ iterables nào.ế ố ượ ỉ ấ
- “Counter” t đ ng đ m s l n m i ph n t xu t hi n và l u tr chúngự ộ ế ố ầ ỗ ầ ử ấ ệ ư ữ
d i d ng m t dictionary.ướ ạ ộ
- Đi u này làm cho vi c th c hi n các tìm ki m ph c t p nh tìm ki mề ệ ự ệ ế ứ ạ ư ế
ph n t xu t hi n nhi u nh t, tìm ki m ph n t không xu t hi n trong danhầ ử ấ ệ ề ấ ế ầ ử ấ ệsách tr nên đ n gi n và hi u qu h n.ở ơ ả ệ ả ơ
from collections import Counter
- “defaultdict” là m t subclass c a dict trong Python, cho phép b n kh i t oộ ủ ạ ở ạ
m t giá tr m c đ nh cho các key không t n t i.ộ ị ặ ị ồ ạ
- Đi u này th ng h u ích khi b n mu n đ m s l n xu t hi n c a m iề ườ ữ ạ ố ế ố ầ ấ ệ ủ ỗ
ph n t trong m t dãy ho c theo dõi các t n su t xu t hi n c a các ph n t ầ ử ộ ặ ầ ấ ấ ệ ủ ầ ử
- Ví d , b n có th s d ng defaultdict(int) đ t o m t dictionary v i giáụ ạ ể ử ụ ể ạ ộ ớ
tr m c đ nh là 0 cho m i key.ị ặ ị ỗ
from collections import defaultdict
# Kh i t o defaultdict v i giá tr m c đ nh là list r ng ở ạ ớ ị ặ ị ỗ
my_dict = defaultdict(list)
# Thêm m t ph n t vào dict ộ ầ ử
my_dict['key'].append(1)
my_dict['key'].append(2)
Trang 14Ví d minh h a: ụ ọ Đ m s l n xu t hi n c a m i ch cái trong m tế ố ầ ấ ệ ủ ỗ ữ ộchu i:ỗ
from collections import defaultdict
text = "hello world"
- D đ c và d hi u: B n có th truy c p tr ng b ng tên thay vì ch s ,ễ ọ ễ ể ạ ể ậ ườ ằ ỉ ố
đi u này làm cho mã c a b n d đ c h n và d hi u h n.ề ủ ạ ễ ọ ơ ễ ể ơ
- Ti t ki m b nh : namedtuple tiêu t n ít b nh h n so v i l p thôngế ệ ộ ớ ố ộ ớ ơ ớ ớ
th ng vì nó không c n l u tr thông tin v các ph ng th c.ườ ầ ư ữ ề ươ ứ
- Kh năng thay đ i d li u: M c dù namedtuple là không thay đ iả ổ ữ ệ ặ ổ(immutable), nh ng b n v n có th thay đ i giá tr c a các tr ng b ng cáchư ạ ẫ ể ổ ị ủ ườ ằ
t o m t th c th m i ho c s d ng ph ng th c _replace.ạ ộ ự ể ớ ặ ử ụ ươ ứ
Cú pháp đ t o m t ể ạ ộ “namedtuple” nh sauư
from collections import namedtuple
# Cú pháp: namedtuple('Tên', ['tr ng1', 'tr ng2', ]) ườ ườ
TênB nGhi = namedtuple('TênB nGhi', ['tr ng1', 'tr ng2', ])ả ả ườ ườ
# Đ nh nghĩa namedtuple ị
Person = namedtuple('Person', ['name', 'age', 'gender'])
# T o m t đ i t ng Personạ ộ ố ượ
person = Person(name='John', age=30, gender='Male')
# Truy c p các tr ng b ng tên ậ ườ ằ
print(person.name)
print(person.age)
Ví d minh h a: Qu n lý thông tin sách trong th vi n ụ ọ ả ư ệ
Vi t m t ch ng trình Python đ qu n lý thông tin v các sách trong thế ộ ươ ể ả ề ư
vi n b ng cách s d ng namedtuple Ch ng trình c a b n c n có các tính năngệ ằ ử ụ ươ ủ ạ ầsau:
1 T o namedtuple có tên là Book v i các tr ng sau:ạ ớ ườ
id: Mã s sách (ki u int)ố ể
title: Tiêu đ sách (ki u str)ề ể
author: Tác gi c a sách (ki u str)ả ủ ể
Trang 15genre: Th lo i c a sách (ki u str)ể ạ ủ ể
year: Năm xu t b n c a sách (ki u int)ấ ả ủ ể
2 T o m t danh sách books ch a thông tin c a m t s sách (ít nh t 5ạ ộ ứ ủ ộ ố ấsách)
3 Vi t hàm print_book_info đ in ra thông tin c a m i sách trong danhế ể ủ ỗsách books
for book in books:
print(f"ID: {book.id}, Title: {book.title}, Author: {book.author}, Genre:{book.genre}, Year: {book.year}")
# 4 Hàm tìm sách theo tác giả
def find_books_by_author(books, author):
author_books = [book for book in books if book.author == author]
Trang 16c hai đ u.
from collections import deque
my_deque = deque([1, 2, 3, 4, 5])
my_deque.append(6) # Thêm ph n t vào cu i ầ ử ố
my_deque.appendleft(0) # Thêm ph n t vào đ u ầ ử ầ
for char in input_str:
while char in seen:
seen.remove(char_deque.popleft())
char_deque.append(char)
seen.add(char)
if len(char_deque) > max_length:
Trang 17max_length = len(char_deque)
max_substring = ''.join(char_deque)
return max_substring
# Nh p chu i t ng i dùng ậ ỗ ừ ườ
input_str = input("Nh p vào m t chu i: ")ậ ộ ỗ
# Tìm chu i con dài nh t không có ký t l p l i ỗ ấ ự ặ ạ
def find_most_common_substring(text, substring_length):
# S d ng defaultdict đ đ m s l n xu t hi n c a m i chu i con ử ụ ể ế ố ầ ấ ệ ủ ỗ ỗ
Trong ví d này, chúng ta s d ng defaultdict đ đ m s l n xu t hi n c aụ ử ụ ể ế ố ầ ấ ệ ủ
m i chu i con có đ dài là substring_length Sau đó, chúng ta s d ng Counterỗ ỗ ộ ử ụ
đ tìm ra chu i con có s l n xu t hi n nhi u nh t Vi c s d ng defaultdictể ỗ ố ầ ấ ệ ề ấ ệ ử ụgiúp chúng ta tránh tình tr ng key ch a t n t i trong t đi n, và Counter giúpạ ư ồ ạ ừ ể
đ n gi n hóa vi c tìm ki m chu i con có s l n xu t hi n nhi u nh t.ơ ả ệ ế ỗ ố ầ ấ ệ ề ấ
Trang 18Bài 2: Đ m s l n xu t hi n c a các t trong m t đo n văn b n, b quaế ố ầ ấ ệ ủ ừ ộ ạ ả ỏcác t ph bi n (stop words):ừ ổ ế
Vi t m t ch ng trình s d ng defaultdict và Counter đ đ m s l n xu tế ộ ươ ử ụ ể ế ố ầ ấ
hi n c a các t trong m t đo n văn b n Tuy nhiên, b n sẽ b qua các t phệ ủ ừ ộ ạ ả ạ ỏ ừ ổ
bi n (stop words) nh "the", "ế ư and", "is", v.v In ra 10 t có s l n xu t hi nừ ố ầ ấ ệnhi u nh t (lo i b stop words).ề ấ ạ ỏ
from collections import defaultdict, Counter
def count_words_without_stopwords(text, stop_words):
# S d ng defaultdict đ đ m s l n xu t hi n c a m i tử ụ ể ế ố ầ ấ ệ ủ ỗ ừ
word_count = defaultdict(int)
# Tách các t t đo n văn b nừ ừ ạ ả
words = text.lower().split()
# Đ m s xu t hi n c a t ng t , b qua stop wordsế ự ấ ệ ủ ừ ừ ỏ
for word in words:
if word not in stop_words:
word_count[word] += 1
# S d ng Counter đ tìm 10 t có s l n xu t hi n nhi u nh tử ụ ể ừ ố ầ ấ ệ ề ấ
top_words = Counter(word_count).most_common(10)
# In k t quế ả
print("Top 10 words without stop words:")
for word, count in top_words:
Trong bài t p này, defaultdict đ c s d ng đ đ m s l n xu t hi n c aậ ượ ử ụ ể ế ố ầ ấ ệ ủ
t ng t , và Counter đ c s d ng đ tìm ra 10 t có s l n xu t hi n nhi uừ ừ ượ ử ụ ể ừ ố ầ ấ ệ ề
nh t (lo i b stop words) B n có th c i ti n ch ng trình b ng cách thêm vàoấ ạ ỏ ạ ể ả ế ươ ằdanh sách stop words ho c đi u ch nh các y u t khác theo yêu c u c a mình.ặ ề ỉ ế ố ầ ủ
S d ng defaultdict ho c Counter trong collections module cho các tác vử ụ ặ ụ
đ m ho c theo dõi thông tin v s xu t hi n c a các ph n t ế ặ ề ự ấ ệ ủ ầ ử
D i đây là ví d v cách s d ng defaultdict và Counter t moduleướ ụ ề ử ụ ừcollections đ th c hi n các tác v đ m ho c theo dõi thông tin v s xu t hi nể ự ệ ụ ế ặ ề ự ấ ệ
Trang 19C hai ph ng th c đ u giúp b n d dàng đ m s xu t hi n c a các ph nả ươ ứ ề ạ ễ ế ự ấ ệ ủ ầ
t trong m t iterable và cung c p thông tin chi ti t v s l n xu t hi n c aử ộ ấ ế ề ố ầ ấ ệ ủ
t ng ph n t Ch n defaultdict khi b n mu n t đ nh nghĩa giá tr m c đ nh choừ ầ ử ọ ạ ố ự ị ị ặ ịkey m i, và ch n Counter khi b n ch quan tâm đ n vi c đ m s xu t hi n c aớ ọ ạ ỉ ế ệ ế ự ấ ệ ủcác ph n t ầ ử
Bài 3: Đ m s l n xu t hi n c a m i t trong m t đo n văn b n:ế ố ầ ấ ệ ủ ỗ ừ ộ ạ ả
Cho m t đo n văn b n, hãy vi t m t ch ng trình s d ng defaultdictộ ạ ả ế ộ ươ ử ụ
Trang 20# Test
sample_text = "This is a sample text This text contains some samplewords."
count_word_occurrences(sample_text)
3.3 Phương pháp tối ưu hóa các vòng lặp.
Tránh s d ng vòng l p l ng nhau n u có th , vì chúng có th làm gia tăngử ụ ặ ồ ế ể ể
đ ph c t p c a ch ng trình.ộ ứ ạ ủ ươ
Sử d ng comprehensions (list comprehensions, dictionaryụcomprehensions) đ làm gi m đ dài và tăng hi u su t c a mã ngu n.ể ả ộ ệ ấ ủ ồ
3.3.1 S d ng List Comprehension: ử ụ
Thay vì s d ng vòng l p l ng nhau đ t o ra m t danh sách m i, b n cóử ụ ặ ồ ể ạ ộ ớ ạ
th s d ng List Comprehension Cho phép t o các list m i m t cách nhanhể ử ụ ạ ớ ộchóng và d đ c ễ ọ Cú pháp List Comprehension có d ng:ạ
new_list = [expression for item in iterable if condition]
Trong đó:
expression là bi u th c đ c tính toán đ t o ra các ph n t c a listể ứ ượ ể ạ ầ ử ủ
m i.ớ
item là bi n l p qua t ng ph n t trong iterable.ế ặ ừ ầ ử
iterable là m t iterable nh list, tuple, ho c range.ộ ư ặ
condition là m t đi u ki n đ l c ra các ph n t (không b t bu c).ộ ề ệ ể ọ ầ ử ắ ộ
Ví d 3: ụ T o list ch a các ch cái vi t th ng t m t chu i:ạ ứ ữ ế ườ ừ ộ ỗ
string = "Hello World"
lowercase_letters = [char for char in string if char.islower()]
Trang 21Bài 1: Tìm t t c các s nguyên t trong m t ph m vi cho tr cấ ả ố ố ộ ạ ướ
Vi t m t ch ng trình Python s d ng list comprehension đ tìm t t c các sế ộ ươ ử ụ ể ấ ả ốnguyên t trong m t ph m vi cho tr c.ố ộ ạ ướ
limit = int(input("Nh p vào m t gi i h n: "))ậ ộ ớ ạ
# S d ng list comprehension đ tìm các s nguyên t trong ph m vi ử ụ ể ố ố ạ
prime_numbers = [num for num in range(2, limit+1) if is_prime(num)]
Vi t m t ch ng trình Python s d ng list comprehension đ tìm t t cế ộ ươ ử ụ ể ấ ảcác s Armstrong trong m t ph m vi cho tr c.ố ộ ạ ướ
limit = int(input("Nh p vào m t gi i h n: "))ậ ộ ớ ạ
# S d ng list comprehension đ tìm các s Armstrong trong ph m vi ử ụ ể ố ạ
armstrong_numbers = [num for num in range(1, limit+1) ifis_armstrong(num)]
# In ra list ch a các s Armstrong ứ ố
print("Các s Armstrong trong ph m vi t 1 đ n", limit, "là:",ố ạ ừ ế
Trang 22Cú pháp c a map() là: map(function, iterable)ủ
Trong đó:
- function là m t hàm mà b n mu n ánh x qua t ng ph n t c a ộ ạ ố ạ ừ ầ ử ủ iterable.
- iterable là m t iterable (ví d : danh sách, tuple, chu i, vv.) mà b n ộ ụ ỗ ạ
Trang 23return x * 2
# Danh sách các số
numbers = [1, 2, 3, 4, 5]
# Sử dụng map để ánh xạ hàm double qua danh sách numbers
result = map(double, numbers)
# result là một iterator, chúng ta có thể chuyển đổi nó thành một danh
sách hoặc sử dụng vòng lặp để duyệt qua các kết quả
result_list = list(result)
print(result_list) # Output: [2, 4, 6, 8, 10]
Chúng ta cũng có thể sử dụng lambda (Lambda được gọi là hàm vô danh)
để tạo hàm ngắn gọn trực tiếp trong map():
# Sử dụng lambda để nhân số cho 2 trực tiếp trong map
result = map(lambda x: x * 2, numbers)
result_list = list(result)
print(result_list) # Output: [2, 4, 6, 8, 10]
Lưu ý rằng kết quả của map() là một iterator, vì vậy bạn có thể lặp qua nó
một lần và sau đó mất đi Để lưu trữ các kết quả, bạn có thể chuyển đổi iterator
thành một danh sách như trong ví dụ trên
b Hàm filter(): Hàm filter() được sử dụng để lọc các phần tử của một
iterable (như list, tuple, hoặc set) thông qua việc áp dụng một hàm điều kiện lên
từng phần tử Nó trả về một iterator chứa các phần tử mà hàm điều kiện trả về
c Hàm reduce(): Hàm reduce() được sử dụng để áp dụng một hàm cho
từng cặp phần tử của một iterable, lần lượt từ trái qua phải, để giảm iterable
xuống một giá trị duy nhất Đầu vào của hàm reduce() phải có ít nhất hai phần
Trang 24Fibonacci có độ dài n.
Trong bài toán này, chúng ta sẽ tính tổng của các số nguyên tố trong một
dãy Fibonacci có độ dài n Để giải quyết bài toán này, chúng ta sẽ sử dụng hàm
filter() để lọc ra các số nguyên tố từ dãy Fibonacci, sau đó tính tổng của chúng
Khi làm việc với dữ liệu trong Python, đặc biệt là dữ liệu có cấu trúc như
mảng đa chiều (array) hoặc bảng dữ liệu, thư viện NumPy và Pandas là hai
công cụ quan trọng được sử dụng phổ biến và đ c bi tặ ệ đ tránh vòng l pể ặ
l ng nhau.ồ
3.4.1 Cách s d ng c b n đ i v i th vi n Numpy ử ụ ơ ả ố ớ ư ệ
Numpy (Numeric Python): là m t th vi n toán h c rât ph bi n vàộ ư ệ ọ ổ ế