Ana içeriğe geç

Python 3.11’de Neler Yeni ve Uğraşmaya Değer mi?

Python 3.11’e gelecek en önemli özelliklerin ayrıntılı bir özeti; beta sürümü nasıl kurulur ve resmi kararlı sürüme ne zaman erişebilirsiniz.
Bexruz (Bex) Tuychiev
Bexruz (Bex) Tuychiev

Ücretsiz Hesabınızı Oluşturun

Alıştırma and program your progress.

Google ile devam edinDevam ederek, Kullanım Koşullarımızı ve Gizlilik Politikamızı kabul etmiş ve verilerinizin ABD'de saklandığını onaylamış olursunuz.

Python, son dört yılın üçünde TIOBE "Yılın Dili" ödülünü kazandı. Popüler programlama dili, 2022’nin ortasında da TIOBE endeksinin zirvesinde yer alıyor.

TIOBE Index

Python, Haziran 2022 TIOBE Endeksi’nin zirvesinde.

Python’un %12,74’lük puanı, “Python” anahtar kelimesinin tüm programlama ilgili arama motoru sorgularının yaklaşık %13’ünde göründüğü anlamına gelir. Başka bir deyişle, internetteki her 7. veya 8. programlama sorusu Python hakkında.

Günümüzde Python, veri bilimi ve yapay zekâdaki en büyük atılımlarla sıklıkla ilişkilendiriliyor. Kullanıcılar, sadeliğini, çok çeşitli yerleşik ve üçüncü taraf kütüphanelerini ve topluluğunu takdir ediyor.

3.11’in nihai kararlı sürümünün 3 Ekim 2022’de gelmesiyle birlikte, Python topluluğunu kayda değer hız artışı, daha iyi hata ayıklama ve hata mesajları ve standart kütüphanelere yönelik çok sayıda kullanım kolaylığı iyileştirmesi dahil olmak üzere bir dizi hoş güncelleme bekliyor.

Python 3.11’in Yeni Özellikleri Neler?

Python 3.11 değişiklik günlüğü, çoğunu fark etmeyeceğiniz kadar uzun bir hata düzeltmeleri, iyileştirmeler ve eklemeler listesi içeriyor. Ancak, kararlı sürümle birlikte Python iş akışınızı ciddi şekilde iyileştirebilecek birkaç kritik yeni özellik var. Bu yenilikler aşağıda özetlenmiştir. 

1. Hız Artışı

Veri bilimcileri için heyecan verici ilk büyük değişiklik hız artışı—standart kıyaslama paketi, 3.10’a kıyasla yaklaşık %25 daha hızlı çalışıyor. Python dokümanları, 3.11’in bazı durumlarda %60’a kadar daha hızlı olabileceğini belirtiyor. İşte hız artışlarını kendiniz test etmek için kıyaslamayı nasıl çalıştıracağınız. 

Python 3.10 ve 3.11’in hızlarını karşılaştırmak için bir Docker kurulumu gerekecektir. Docker Desktop’ın çalıştığından emin olduktan sonra, iki Python sürümüne ait iki imajı indirmek için terminalde şu iki komutu çalıştırın.

$ docker run -d python:3.10.4-bullseye

$ docker run -d python:3.11-rc-bullseye

İndirilen imajlar Docker panonuzda görünmelidir; buradan çalıştırabilirsiniz.

Docker installation of python 3.11

Konteynerleri başlattıktan sonra, docker ps komutunu çalıştırarak konteyner kimliği, imaj, durum ve daha fazlası gibi ayrıntıları görebilirsiniz.

Çalışan konteynerler ayrıca panodaki Containers sekmesinde görünür; "Run/Stop"un yanındaki CLI düğmelerini de burada bulabilirsiniz. Her iki konteyner için de bu düğmelere tıklayarak konteynerlere bağlı iki terminal sekmesi açın.

Her iki sekmede de pip ile pyperformance paketini kurun. Ardından her konteyner terminalinde aşağıdaki komutları çalıştırın.

Python 3.10 için

$ pyperformance run -r -o py310.json

Python 3.11 için

$ pyperformance run -r -o py310.jsone run -r -o py311.json

Bu komutlar, standart kütüphanelerden yaklaşık 60 Python fonksiyonu için kıyaslama testlerini çalıştırır ve JSON meta verileri üretir. Testlerin sıkı olmasını istediğimi belirtmek için isteğe bağlı olarak -r etiketini ekledim; bu da daha uzun sürer. Benim durumda her iki konteyner de AMD Ryzen 12 çekirdekli CPU’ya sahip bir Windows makinede çalışıyor.

Şimdi iki konteynerde iki JSON dosyamız var ve hız testine devam etmek için her ikisini de tek bir dizinde toplamamız gerekiyor. Bunun için, JSON dosyasını Python 3.11 konteynerinden 3.10’a kopyalamak üzere docker cp komutunu kullanacağız.

Bilgisayarınızdaki doğru yolu yansıtacak şekilde yolu güncelleyerek, ayrı bir terminal sekmesinde aşağıdaki komutları çalıştırın:

$ docker cp crazy_snyder:/py311.json C:/Users/bex/Desktop

$ docker cp C:/Users/bex/Desktop/py311.json charming_proskuriakova:/

Benim durumda, crazy_snyder ve charming_proskuriakova, çalışan konteynerlerin kimlikleri. Artık her iki JSON dosyası da Python 3.10 konteynerinde. Kıyaslamayı tamamlamak ve sonuçları CSV olarak kaydetmek için aşağıdaki komutları çalıştırın.

$ pyperformance compare py310.json py311.json --csv comparison.csv

$ docker cp charming_proskuriakova:/comparison.csv C:/Users/bex/Desktop/articles

Son olarak, CSV’yi Pandas ile yükleyip analiz edelim:

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.read_csv("data/comparison.csv")
df.rename({"Base": "py310", "Changed": "py311", "Benchmark": "function"},
                   axis=1,
                   inplace=True)
>>> df.shape
(59, 3)
>>> df.sample(5)
 Functionpy310py311
40scimark_monte_carlo0.123920.08052
19mako0.019670.01289
1chameleon0.011310.00843
8float0.142650.09133
35regex_effbot0.003150.00261

Veri çerçevesindeki her satır, verilen Python fonksiyonunu çalıştırmanın her iki sürümde ne kadar sürdüğünü (milisaniye cinsinden) kaydeder. Hız artışlarının bir histogramını çizelim.

df["speed_up"] = (df["py310"] / df["py311"]).round(3)

fig, ax = plt.subplots()

sns.histplot(df["speed_up"], bins=11)
ax.set(xlabel="Speedup (times)", 
           title="Python 3.10 vs. Python 3.11 - speedup comparison")

plt.show()

Difference in speed betweeon python 3.11 and python 3.10

Grafikten, Python 3.11’deki fonksiyonların çoğunun yaklaşık 1,2 kat (%20) daha hızlı olduğu açıkça görülüyor. Bu tahmini ortalama ve medyanla da doğrulayabiliriz.

>>> df["speed_up"].mean()
1.2605593220338982
>>> df["speed_up"].median()
1.207

Hız artışının %60’ı aştığı bir durum da var gibi görünüyor. 

>>> df["speed_up"].max()
1.899

Ayrıca Python 3.10’un yeni sürümden daha hızlı olduğu dört vaka bulunuyor.

>>>  (df["speed_up"] <= 1).sum() 
4

Performans artışları kâğıt üzerinde fark edilir olsa da, iyileştirmelerin somut etkisi kişiden kişiye değişecektir ve Python 3.11’in kararlı, nihai sürümü henüz yayımlanmadı. Kıyas testi, günlük işinizde çok kullanmayabileceğiniz saf Python fonksiyonlarını kullanır, ancak hem Python 3.10 hem de 3.11 için Docker kurulumu yapmak, kendi kullanım senaryolarınız için hız artışları hakkında fikir edinmenizi sağlayacaktır. 

2. Daha İyi Hata Mesajları

Python 3.11’in bir diğer heyecan verici özelliği, hatanın tam konumunu işaret eden daha iyi hata mesajları. Yorumlanması zor bir hata mesajıyla biten 100 satırlık bir traceback döndürmek yerine, Python 3.11 hataya neden olan ifadeyi doğrudan gösteriyor.

Traceback errors in python 3.10

Yukarıdaki örnekte, Python yorumlayıcısı, None değeri nedeniyle betiği çökerten x’i işaret ediyor. Mevcut Python sürümlerinde, ‘x’ özniteliğine sahip iki nesne olduğundan hata belirsiz olacaktı. Ancak 3.11’in hata işleme sistemi sorunlu ifadeyi açıkça gösteriyor. 

Bu örnek, 3.11’in derin iç içe geçmiş bir sözlükteki hatayı nasıl tam olarak tespit ettiğini ve hatanın hangi anahtarla ilgili olduğunu net biçimde gösterebildiğini sergiliyor.

Traceback messages in python 3.11

Aynı hassasiyeti karmaşık aritmetik ifadelerde de görebilirsiniz.

Traceback messages in Python 3.11

Güncellenmiş hata mesajları, özellikle betiklerde hata ayıklamakta zorlanan veri bilimciler için kesinlikle hoş bir yenilik.

3. İstisna Notları

“Açık, örtükten iyidir.”

Yukarıdaki cümle, Python’un 20 tasarım ilkesinden oluşan listesi olan Python’un Zen’inin ikinci satırıdır. Bu ilke, Python kodunun olabildiğince ifade gücü yüksek olması gerektiğini anlatır.

Bu tasarım kalıbını güçlendirmek için Python 3.11, istisna notlarını (PEP 678) sunuyor. Artık except bloklarınız içinde add_note() fonksiyonunu çağırıp bir hata yükselttiğinizde özel bir mesaj iletebilirsiniz.

import math

try:
  math.sqrt(-1)
except ValueError as e:
  e.add_note("Negative value passed! Please try again.")
  raise

Custom exceptions

Aşağıdaki gibi özel bir istisna sınıfı yazdıysanız, korumalı sınıf düzeyi öznitelik __notes__ içinde sınıfa birden fazla not ekleyebilirsiniz:

import math

class MyOwnError(Exception):
   # Should be a list of strings
   __notes__ = ["This is a custom error!"]

try:
   math.sqrt(-1)
except:
   raise MyOwnError

custom exceptions

Artık yorumlayıcı hatayla karşılaştığında, normal mesaj gövdesinin ardından özel mesajı da gösterecek.

Ayrıca, yeni ExceptionGroup sınıfıyla birlikte kullanılan except* bloğu ile istisnaları yükseltmek için yeni bir sözdizimi de var. PEP 654, bunu çeşitli senaryolarda ilgisiz birden fazla hatayı aynı anda yükseltmek için kullanabileceğinizi söylüyor. Bu durumların çoğu web soketleriyle çalışma, asyncio ile eşzamanlı programlama gibi gündelik veri bilimi işlerinde nadiren karşınıza çıkacak kadar niş; ancak ilginizi çekiyorsa yeni sözdizimi hakkında buradan bilgi edinebilirsiniz.

4. Yeni Tip Belirtimi: Self

Statik olarak tiplenen diller, kodunuzun okunabilirliğini ve hata ayıklanmasını kolaylaştırır. Değişkenlerin, fonksiyon girdilerinin ve çıktıların tam tipini tanımlamak, saatlerce sürecek hata ayıklama süresini kurtarabilir ve kodunuzu başkalarının okumasını kolaylaştırabilir. Tip notasyonları eklemek, modern IDE’lerin siz isimlerini yazarken fonksiyon tanımlarını göstermesini de sağlar; böylece fonksiyonlarınız başkalarınca daha kolay anlaşılır.

Bugüne kadar Python’daki güçlü typing modülü, kendisiyle ilgili örnekler döndüren sınıflar hariç, neredeyse her veri tipi için sınıflara sahipti. Mevcut Python sürümlerinde aşağıdaki örnek mümkün değildir:

from typing import Self
class Language:

  def __init__(self, name, version, release_date):
      self.name = name
      self.version = version
      self.release_date = release_date

  def change_version(self, version) -> Self:
      self.version = version

      return Language(self.name, self.version, self.release_date)

Ancak Python 3.11, Self sınıfını tanıtıyor; eğer bir fonksiyonun dönüş değeri self ya da sınıfın yeni bir örneğiyse, bunu fonksiyon tanımına ekleyebilirsiniz.

5. Standart Kütüphanelerde İyileştirmeler

Standart kütüphanelerde birkaç başka kullanım kolaylığı iyileştirmesi de var. Öncelikle, math modülüne uzun zamandır beklenen iki fonksiyon eklendi.

>>> import math
>>> math.cbrt(9)  # Find the cube-root of x
2.080083823051904
>>> math.cbrt(27)
3.0000000000000004
>>> math.exp2(5)  # Raise 2 to the power of x
32.0

Küp kök fonksiyonunun Python’a eklenmesinin 28 yıl almış olması oldukça şaşırtıcı; ama geç olsun güç olmasın.  

fractions modülü de, string’lerden kesir oluşturmanıza olanak tanıyan yeni bir özellik ekledi:

>>> from fractions import Fraction
>>> Fraction("22/7")  # New in Python 3.11
Fraction(22, 7)
>>> Fraction(numerator=22, denominator=7)
Fraction(22, 7)
>>> Fraction("3e-4")
Fraction(3, 10000)
>>> Fraction("-73/41")
Fraction(-73, 41)
>>> Fraction(3.1415)  # Find the closest approximation to the given float
Fraction(7074029114692207, 2251799813685248)

Görüldüğü gibi, fractions modülü belirli aritmetik işlemler için oldukça kullanışlı olabilir. Özellikle, verilen ondalık sayıyı en iyi yaklaştıran kesri bulabilmeniz hoşuma gidiyor. Bunu payda sınırı vererek bir adım daha ileri götürebilirsiniz:

>>> from math import pi
>>> Fraction(pi).limit_denominator(100000)
Fraction(312689, 99532)

Ayrıca, TOML belgelerini ayrıştırmak için tomllib adında yeni bir modül var. TOML (Tom's Obvious Minimal Language), insan tarafından okunabilir yapılandırma dosyaları yazmak için popüler bir dosya biçimidir. İşte projenin ana sayfasından bir görsel:

TOML landing page

import tomllib

toml_str = """
python-version = "3.11.0"
release_date = "2022-10-22"
"""

data = tomllib.loads(toml_str)
print(data)  # {'python-version': '3.11.0', 'release_date': '2022-10-22'}
print(data['python-version'])  # 3.11.0
print(data['release_date'])  # 2022-10-22

Python 3.11 Çıkış Tarihi

Python 3.11’in geliştirmesi 5 Mayıs 2021’de başladı. O zamandan bu yana yedi alfa sürümü yayımlandı ve 8 Mayıs 2022’de ilk beta sürümüyle eşzamanlandı. Bu tarihten resmi sürüme kadar Python’a yeni özellik eklenmeyecek.

Nihai, kararlı sürüm; bu arada üç ek beta ve iki sürüm adayı sonrasında 3 Ekim 2022’de yayımlanacak. Python hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara göz atabilirsiniz.

Konular

İlgili