Döngüleri ortadan kaldırma

Verimli Python Kodu Yazmak

Logan Thomas

Scientific Software Technical Trainer, Enthought

Python’da döngüler

  • Döngü kalıpları:
    • for döngüsü: diziyi öğe öğe yinele
    • while döngüsü: koşul sağlandıkça yinele
    • İç içe döngüler: bir döngü içinde başka döngü
    • Maliyetli!
Verimli Python Kodu Yazmak

Döngüleri kaldırmanın faydaları

  • Daha az satır kod
  • Daha okunaklı kod
    • "Yassı, iç içeden iyidir"
  • Verimlilik artışı
Verimli Python Kodu Yazmak

Yerleşiklerle döngüleri kaldırma

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

alt=”Abomasnow, Abra ve Absol adlı Pokémon’lar ve bunların Can Puanı, Saldırı, Savunma ve Hız metaverilerinin vurgulanmış hâli”

Verimli Python Kodu Yazmak
# HP, Attack, Defense, Speed listesi
poke_stats = [
    [90,  92, 75, 60],
    [25,  20, 15, 90],
    [65, 130, 60, 75],
    ...
]

# For döngüsü yaklaşımı totals = [] for row in poke_stats: totals.append(sum(row))
# Liste üreteci totals_comp = [sum(row) for row in poke_stats]
# Yerleşik map() fonksiyonu totals_map = [*map(sum, poke_stats)]
Verimli Python Kodu Yazmak
%%timeit
totals = []
for row in poke_stats:
    totals.append(sum(row))
140 µs ± 1.94 µs döngü başına (7 çalıştırma, her biri 10000 döngü; ortalama ± std. sapma)
%timeit totals_comp = [sum(row) for row in poke_stats]
114 µs ± 3.55 µs döngü başına (7 çalıştırma, her biri 10000 döngü; ortalama ± std. sapma)
%timeit totals_map = [*map(sum, poke_stats)]
95 µs ± 2.94 µs döngü başına (7 çalıştırma, her biri 10000 döngü; ortalama ± std. sapma)
Verimli Python Kodu Yazmak

Yerleşik modüllerle döngüleri kaldırma

poke_types = ['Bug', 'Fire', 'Ghost', 'Grass', 'Water']
# İç içe for döngüsü yaklaşımı
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))
# Yerleşik modül yaklaşımı
from itertools import combinations
combos2 = [*combinations(poke_types, 2)]
Verimli Python Kodu Yazmak

NumPy ile döngüleri kaldırma

# HP, Attack, Defense, Speed dizisi
import numpy as np

poke_stats = np.array([
    [90,  92, 75, 60],
    [25,  20, 15, 90],
    [65, 130, 60, 75],
    ...
])
Verimli Python Kodu Yazmak

NumPy ile döngüleri kaldırma

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  ...]
Verimli Python Kodu Yazmak

NumPy ile döngüleri kaldırma

%timeit avgs = poke_stats.mean(axis=1)
23.1 µs ± 235 ns döngü başına (7 çalıştırma, her biri 10000 döngü; ortalama ± std. sapma)
%%timeit
avgs = []
for row in poke_stats:
    avg = np.mean(row)
    avgs.append(avg)
5.54 ms ± 224 µs döngü başına (7 çalıştırma, her biri 100 döngü; ortalama ± std. sapma)
Verimli Python Kodu Yazmak

Hadi pratik yapalım!

Verimli Python Kodu Yazmak

Preparing Video For Download...