Python Programlama Dili: Yüksek performanslı algoritmalar geliştirin ve optimize edin

kapanış bildirimi

Bu makale İngilizce olarak da mevcuttur. Teknik yardımla tercüme edildi ve yayınlanmadan önce editoryal olarak gözden geçirildi.

Birden fazla şehir arasında bir gezi planlıyorsanız ve en kısa rotayı bulmak istiyorsanız, iyi tanımlanmış bir deterministik işlemler dizisi olan algoritmalara başvurursunuz. Bu makale şehirler arasındaki en kısa rotaları bulan bir algoritma geliştirme sürecini takip ediyor. İlk çizimden Matplotlib ve NetworkX ile test ve görselleştirmeye, uygun veri yapılarını kullanarak optimizasyona kadar adım adım yolu gösterir. Bu, yalnızca işlevsel olarak doğru şekilde çalışan değil, aynı zamanda yüksek performanslı bir program oluşturur.

Duyurudan sonra devamını okuyun

Michael Inden, yirmi yılı aşkın mesleki deneyime sahip bir Java ve Python meraklısıdır. Halen Geliştirme Müdürü olarak çalışıyor, konferanslarda konuşuyor ve Java ve Python üzerine teknik kitaplar yazıyor.

Amaç, şehirleri en kısa yoldan birbirine bağlayan yol ağındaki rotaları bulmaktır. Grafikler modelleme için kullanılabilir. Şekil 1'de etiketli daireler şehirleri, numaralı bağlantı hatları ise mesafeli rotaları temsil etmektedir.

Bir grafik şehirler arasındaki mesafeleri görüntüler; sayılar mesafeleri temsil eder (Şekil 1).

Bir grafik şehirler arasındaki mesafeleri görüntüler; sayılar mesafeleri temsil eder (Şekil 1).

Bir grafik şehirler arasındaki mesafeleri görüntüler; sayılar mesafeleri temsil eder (Şekil 1).

Bu basitleştirilmiş harita için A'dan D'ye en kısa rotayı bulmak istiyoruz. Yalnızca birkaç şehir ve bağlantıyla tüm seçenekleri deneyebilirken, şehirler ve bağlantı sayısı arttıkça yaklaşım daha karmaşık hale gelir. 13'ün en kötü ve 6'nın en iyi olduğu aşağıdaki bağlantılar mümkündür:


A -> B -> C -> D => 5 + 1 + 7 = 13
A -> C -> B -> D => 2 + 1 + 3 = 6
A -> C -> D => 2 + 7 = 9
A -> B -> D => 5 + 3 = 8

Hesaplamaların ve işlemlerin gerçekleştirilme hızı, programların iyi kullanılabilirliğiyle ilgilidir. Bu özellikle büyük miktarda veri için geçerlidir. O gösterimi, algoritmaların sınıflandırılmasına ve giriş kümesi arttıkça bir algoritmanın yürütme süresinin (veya bellek gereksiniminin) büyümesinin tanımlanmasına yardımcı olur. Bu, örneğin bir listenin artık 10 veya 20 yerine 100.000 veya daha fazla veri noktası içermesi durumunda etkileri tahmin etmenin mümkün olduğu anlamına gelir.

Duyurudan sonra devamını okuyun

O gösterimi, işlemlerin yürütme süresinin tahmin edilmesine yardımcı olur. Algoritma ve fonksiyonları karmaşıklık sınıflarına göre sınıflandırır. AO(n³) adım sayısı giriş miktarının küpü kadar artar. 100 giriş verisi ile çaba 100'dür3 hesaplama için, yani 1.000.000 adım. Karmaşıklık sınıfı ne kadar düşük olursa o kadar iyidir. “Karmaşıklık sınıflarına bölünmüş algoritmalarla O-gösterimi” tablosu diğer sınıfları gösterir; Şekil 2'de etkiler görselleştirilmiştir.

Karmaşıklık sınıflarına bölünmüş algoritmalarla O gösterimi

gösterim

anlamı, büyüme

Örnek

Ç(1)

devamlı

Bir liste öğesine erişme

O(log n)

logaritmik

İkili arama

AÇIK)

doğrusal

tüm elemanlarda basit döngü

O(n log n)

doğrusal-logaritmik

verimli sıralama algoritmaları (birleştirme sıralaması gibi)

O(n²)

kare

çift ​​iç içe döngü

AÇIK3)

küp

üçlü iç içe döngü

Grafikler, girişin boyutuna bağlı olarak işlem sayısını göstermektedir (Şekil 2).

Grafikler, girişin boyutuna bağlı olarak işlem sayısını göstermektedir (Şekil 2).

Grafikler, girişin boyutuna bağlı olarak işlem sayısını göstermektedir (Şekil 2).

O notasyonunu kullanan bir sınıflandırma, donanım ekipmanı, uygulama ayrıntıları ve seçilen programlama dillerinden bağımsız olarak yürütme sürelerini ölçeklenebilirlik özelliklerine göre karşılaştırmak için özellikle önemlidir.

Basitleştirilmiş değerlendirme için, küçük sabitler veya daha küçük terimler ve faktörler büyük girdiler için ihmal edilebilir olduğundan, değerlendirmede yalnızca baskın terim dikkate alınır. hayır formülünde3 + 4n² + 3n + 7, basitleştirmeler nedeniyle çalışma zamanı sınıfı O(n)'yi takip eder3).

Sistematik bir yaklaşım, daha küçük programlar ve özellikle karmaşık yazılım projeleri için bile işlevsel, bakımı yapılabilir, yüksek performanslı kod elde etmenin anahtarıdır.

1. Sorunu anlayın ve analiz edin

  • hangi sorunun çözülmesi gerektiğini netleştirin ve onu alt görevlere bölün;
  • Alt görevler için kanıtlanmış çözümlerin mevcut olup olmadığını kontrol edin; sıralanmış veritabanlarında yüksek performanslı aramalar için ikili arama, en kısa yollar için Dijkstra algoritması;
  • giriş ve çıkış verilerini tanımlayın;
  • Sınır koşullarını ve özel durumları göz önünde bulundurun.

2. Kaba bir yapı planlayın ve geliştirin

  • sorunu alt görevlere ayırın;
  • süreçleri doğal dilde formüle etmek veya özetlemek;
  • Uygun veri yapılarını seçin (listeler, sözlükler, yığınlar).

3. Uygulama

  • Kaynak kodunu açıkça ayrılmış işlevler veya sınıflar halinde düzenleyin;
  • Okunabilirlik ve anlaşılırlığa dikkat edin, anlamlı isimler ve (eğer uygunsa) ek yorumlar kullanın;
  • Geliştirme süresinden tasarruf etmek için mevcut kütüphaneleri kullanın (örn. görselleştirme için Matplotlib).

4. Test (kanıt testi ve birim testleri)

  • Nasıl çalıştığını deneyin;
  • İşlevselliği doğrulamak ve kenarları ve özel durumları kapsamak için birim testleri yazın.

5. Performansı ölçün

  • 100, 10.000 ve 1.000.000 veri seti gibi küçük, orta ve büyük veri setleri üzerinde ölçümler gerçekleştirin;
  • Darboğazların belirlenmesi, ancak bunlar genellikle yalnızca çok büyük veri kümelerinde belirginleşir.

6. Optimize edin

5. adımda zayıflıklar keşfedilirse alt problemler için uygulamaya ve seçilen algoritmalara daha yakından bakmalısınız.

  • Karmaşıklığı resmi olarak değerlendirmek için O notasyonunu kullanın: hangi döngüler? Arama nasıl ve nerede gerçekleşiyor: doğrusal mı yoksa ikili aramayla mı? Farklı eylemler için yürütme süresi O(1) olabilirO(log n) veya O(n) Anlam.
  • Daha uygun algoritmalar veya daha verimli veri yapıları kullanın.

Dağıtımı ve testi bir arada yapın

Pratikte 3. ve 4. adımlar her zaman birbirinden bağımsız olarak gerçekleştirilmez. Sonuçları iyi tahmin edebiliyorsanız test senaryoları oluşturmaya başlamanız mantıklı olacaktır. Ancak bazen uygulamak için önce bir fikre ve prototipe ihtiyacınız olur. Özellikle büyük programlama projelerinde uygulama ve test aşamasında ek gereksinimler ortaya çıkar.

Aşağıdaki süreç pratikte kendini kanıtlamıştır ve bir algoritma geliştirirken de kullanılabilir.


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir