Loại bỏ vòng lặp

Viết mã Python hiệu quả

Logan Thomas

Scientific Software Technical Trainer, Enthought

Vòng lặp trong Python

  • Mẫu lặp:
    • Vòng lặp for: duyệt tuần tự từng phần tử
    • Vòng lặp while: lặp khi điều kiện còn đúng
    • Vòng lặp lồng nhau: dùng một vòng trong vòng khác
    • Tốn kém!
Viết mã Python hiệu quả

Lợi ích của việc loại bỏ vòng lặp

  • Ít dòng code hơn
  • Dễ đọc hơn
    • "Phẳng tốt hơn lồng nhau"
  • Hiệu năng tốt hơn
Viết mã Python hiệu quả

Loại bỏ vòng lặp với hàm tích hợp

# Danh sách HP, Attack, Defense, Speed
poke_stats = [
    [90,  92, 75, 60],
    [25,  20, 15, 90],
    [65, 130, 60, 75],
    ...
]

alt=”Pokemon Abomasnow, Abra, và Absol cùng siêu dữ liệu HP, Attack, Defense, Speed được tô sáng”

Viết mã Python hiệu quả
# Danh sách HP, Attack, Defense, Speed
poke_stats = [
    [90,  92, 75, 60],
    [25,  20, 15, 90],
    [65, 130, 60, 75],
    ...
]

# Cách dùng for totals = [] for row in poke_stats: totals.append(sum(row))
# List comprehension totals_comp = [sum(row) for row in poke_stats]
# Hàm tích hợp map() totals_map = [*map(sum, poke_stats)]
Viết mã Python hiệu quả
%%timeit
totals = []
for row in poke_stats:
    totals.append(sum(row))
140 µs ± 1.94 µs mỗi vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 10000 vòng mỗi lần)
%timeit totals_comp = [sum(row) for row in poke_stats]
114 µs ± 3.55 µs mỗi vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 10000 vòng mỗi lần)
%timeit totals_map = [*map(sum, poke_stats)]
95 µs ± 2.94 µs mỗi vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 10000 vòng mỗi lần)
Viết mã Python hiệu quả

Loại bỏ vòng lặp bằng mô-đun tích hợp

poke_types = ['Bug', 'Fire', 'Ghost', 'Grass', 'Water']
# Cách dùng vòng lặp lồng nhau
combos = []
for x in poke_types:
    for y in poke_types:
        if x == y:
            continue
        if ((x,y) not in combos) & ((y,x) not in combos):
            combos.append((x,y))
# Cách dùng mô-đun tích hợp
from itertools import combinations
combos2 = [*combinations(poke_types, 2)]
Viết mã Python hiệu quả

Loại bỏ vòng lặp với NumPy

# Mảng gồm HP, Attack, Defense, Speed
import numpy as np

poke_stats = np.array([
    [90,  92, 75, 60],
    [25,  20, 15, 90],
    [65, 130, 60, 75],
    ...
])
Viết mã Python hiệu quả

Loại bỏ vòng lặp với NumPy

avgs = []
for row in poke_stats:
    avg = np.mean(row)
    avgs.append(avg)

print(avgs)
[79.25, 37.5, 82.5, ...]
avgs_np = poke_stats.mean(axis=1)

print(avgs_np)
[ 79.25  37.5   82.5  ...]
Viết mã Python hiệu quả

Loại bỏ vòng lặp với NumPy

%timeit avgs = poke_stats.mean(axis=1)
23.1 µs ± 235 ns mỗi vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 10000 vòng mỗi lần)
%%timeit
avgs = []
for row in poke_stats:
    avg = np.mean(row)
    avgs.append(avg)
5.54 ms ± 224 µs mỗi vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 100 vòng mỗi lần)
Viết mã Python hiệu quả

Luyện tập nào!

Viết mã Python hiệu quả

Preparing Video For Download...