1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Skkn cấp tỉnh 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

49 1 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề 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
Tác giả Nguyễn Hồng Dương
Trường học Trường THPT Mường Quạ
Chuyên ngành Tin học
Thể loại Sáng kiến kinh nghiệm
Năm xuất bản 2023 - 2024
Thành phố Nghệ An
Định dạng
Số trang 49
Dung lượng 220,59 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

ĐỀ 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 1

TÀ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 2

MỤ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 4

so 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 5

chuyê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 6

Tố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 7

arr_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 8

Bà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 9

nghĩ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 10

print("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 11

S 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 12

Bà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 13

cá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 14

Ví 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 15

genre: 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 16

c 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 17

max_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 18

Bà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 19

C 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 21

Bà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 22

Cú 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 23

return 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 24

Fibonacci 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àộ ư ệ ọ ổ ế

Ngày đăng: 09/03/2025, 21:28

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w